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