스트림

프로그래밍/Java 2019. 12. 27. 08:30

스트림

스트림은 리스트나 컬렉션에 대해 자료들을 정렬하거나 조건에 맞게 출력하는 여러가지 기능들을 미리 구현되어 있어 이를 쉽게 사용하기 위한 기능이다.

스트림 구현은 람다식을 사용한다.

스트림에는 "중간연산" 과 "최종연산" 이 있다.


중간연산: fillter, map

최종연산: forEach, count, sum, reduce


스트림으로 정수 배열의 갯수와 합계를 출력

package stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class IntArrayTest {
    public static void main(String[] args) {
        int[] arr = {1, 2, 3, 4, 5};

        int sumVal = Arrays.stream(arr).sum(); // 합계를 구함.
        int count = (int)Arrays.stream(arr).count(); // 카운트

        System.out.println(sumVal);
        System.out.println(count);                        

    }

}

  • 반복문으로 하면 길어지는 코딩들이 stream 을 사용하면 간단하게 구현할 수 있다.

컬렉션 리스트를 스트림으로 구현

package stream;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class IntArrayTest {
    public static void main(String[] args) {        
        List<String> sList = new ArrayList<String>();
        sList.add("tomas");
        sList.add("Edward");
        sList.add("Jack");

        Stream<String> stream = sList.stream();
        stream.forEach(s -> System.out.print(s + " "));

        System.out.println();
        System.out.print("----------- 스트립 sorted 메서드 사용 ---------------");
        System.out.println();

        Stream<String> stream2 = sList.stream();
        stream2.sorted().forEach(s -> System.out.print(s + " "));


    }

}


reduce

미리 정해져 있는 스트림 기능 이외에 프로그래머가 직접 정의해서 사용할 수 있는 메서드
반드시 BinaryOperator 함수형 인터페이스를 구현해야한다.

package stream;

import java.util.Arrays;
import java.util.function.BinaryOperator;

class CompareString implements BinaryOperator<String> {

    @Override
    public String apply(String s1, String s2) {
        if(s1.getBytes().length >= s2.getBytes().length) return s1;
        else return s2;
    }
}



public class ReduceTest {

    public static void main(String[] args) {

        String[] greetings = {"안녕하세요~~~~", "hello", "Good morning", "반갑습니다^^"};

        System.out.println(Arrays.stream(greetings).reduce("", (s1, s2) -> {if(s1.getBytes().length >= s2.getBytes().length) return s1; else return s2;}));
        String str = Arrays.stream(greetings).reduce(new CompareString()).get();
        System.out.println(str);


    }

}
  • reduce 를 사용해 직접 구현하는 방식과 BinaryOperator 인터페이스를 직접 구현한 방식 두가지가 있다.

스트림 메서드 기능을 활용하여, 여행객 정보 구하기.

TravleCustomer

package stream;

public class TravleCustomer {
    private String name;
    private int age;
    private int price;

    public TravleCustomer(String name, int age, int price) {
        this.name = name;
        this.age = age;
        this.price = price;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public int getPrice() {
        return price;
    }

    @Override
    public String toString() {
        return "TravleCustomer [name=" + name + ", age=" + age + ", price=" + price + "]";
    }


}

TravelTest

package stream;

import java.util.ArrayList;
import java.util.List;

public class TravelTest {

    public static void main(String[] args) {
        TravleCustomer customerLee = new TravleCustomer("이순신", 40, 100);
        TravleCustomer customerKim = new TravleCustomer("김유신", 20, 100);
        TravleCustomer customerHong = new TravleCustomer("이순신", 13, 50);

        List<TravleCustomer> customerList = new ArrayList<TravleCustomer>();
        customerList.add(customerLee);
        customerList.add(customerKim);
        customerList.add(customerHong);

        System.out.println("== 고객 명단 추가된 순서대로 출력 ==");
        customerList.stream().map(c->c.getName()).forEach(s->System.out.println(s));

        int total = customerList.stream().mapToInt(c->c.getPrice()).sum();
        System.out.println("총 여행 비용은 : " + total + " 입니다.");

        System.out.println("== 20세 이상 고객 명단 순서대로 출력 ==");
        customerList.stream().filter(c->c.getAge() >= 20).map(c->c.getName()).sorted().forEach(s-> System.out.println(s));

    }

}

  • 스트림을 사용하면 자료들이 정렬되어있지 않더라도 정렬을 할 수 있으며 특정 조건에 맞는 자료들만 추출할 수 있다.
  • DB 쿼리와 비슷한 모습을 보인다.
  • 아주 유용한 기능임에 틀림없다.

출처: do it 자바프로그래밍.

'프로그래밍 > Java' 카테고리의 다른 글

스트림(파일)  (0) 2020.01.04
예외처리  (0) 2019.12.29
람다식  (0) 2019.12.25
내부 클래스  (0) 2019.12.25
Map  (0) 2019.12.20
블로그 이미지

파니동

,