컬렉션의 저장요소를 하나씩 참조해서 람다식(함수적스타일)로 처리할 수 있도록 해주는 반복자이다.

List<String> list = Arrays.asList("홍길동", "신용권", "김자바");
Stream<String> stream = list.stream();
stream.forEach( name -> System.out.println(name); }

//forEach 메소드는 다음과 같이 Consumer 함수적 인터페이스 타입의 매개값을 가지므로
// 컬렉션의 요소를 소비할 코드를 람다식으로 기술할 수 있다.
void forEach(Consumer<T> action)

스트림의 연산은 기존 자료를 변경하지 않는다. 자료에 대한 스트림을 생성하면 스트림이 사용하는 메모리 공간은 별도로 생성되므로 연산이 수행되도 기존 자료에 대한 변경은 발생하지 않는다.

스트림은 중간 처리와 최종 처리를 할 수 있다.

스트림은 컬렉션의 요소에 대해 중간 처리와 최종 처리를 수행할 수 있는데, 중간 처리에서는 매핑, 필터링, 정렬을 수행하고 최종 처리에서는 반복, 카운팅, 평균, 총합 등의 집계 처리를 수행한다.

스트림에 대해 중간 연산은 여러 개의 연산이 적용될 수 있지만 최종 연산은 마지막에 한 번만 적용된다.

그러므로 중간 연산에 대한 결과를 연산 중에 알수 없다.

최종처리가 시작되기 전까지 중간 처리는 지연(lazy)된다.

스트림 생성하고 사용하기

정수 배열에 스트림 생성하여 연산을 수행하기

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

        for (int i : arr) {
            System.out.println("i = " + i);
        }

        // forEach : 배열의 인자들을 하나씩 꺼냄
        Arrays.stream(arr).forEach(number -> System.out.println("number = " + number));
        
        // 스트림은 사용하고 나면 항상 재생성해야한다.
        int sum = Arrays.stream(arr).sum();
        long count = Arrays.stream(arr).count();
        
        System.out.println("sum = " + sum);
        System.out.println("count = " + count);
    }
}

 

중간 연산과 최종 연산

  • 중간 연산의 예 - filter(), map(), sorted() 등
    • 조건에 맞는 요소를 추출(filter)하거나 요소를 변환 함(map)
  • 최종 연산이 호출될 때 중간 연산이 수행되고 결과가 생성됨

문자열 리스트에서 문자열의 길이가 5이상인 요소만 출력하기

 String[] stringList = {"qwerty", "Longest", "Substring", "add", "divide", "multiple", "sub"};
 Arrays.stream(stringList).filter(s -> s.length() >= 5).forEach(System.out::println);

filter()는 중간 연산이고, forEach는 최종 연산이다.

중간 연산과 최종 연산에 대한 구현은 람다식을 활용한다.

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

        Stream<String> stream = stringList.stream();
        stream.forEach(System.out::println);

        stringList.stream().sorted().forEach(string -> System.out.print(string + "\t"));
        System.out.println();
        stringList.stream().map(String::length).forEach(len -> System.out.print(len + "\t"));
    }
}

'JAVA' 카테고리의 다른 글

POJO Java  (0) 2021.05.09
Java I/O Stream - 4 성능 향상 보조 스트림  (0) 2021.05.07
Java I/O Stream -2 파일 입출력  (0) 2021.05.07
Java I/O Stream -3 보조 스트림  (0) 2021.05.07
Java I/O Stream -1 기본 스트림  (0) 2021.05.07

+ Recent posts