- 다양한 데이터 소스(컬렉션, 배열)를 표준화해서 다루는 방법
- 배열, 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자
한 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태의 연결된 구조
파이프라인은 여러 개의 스트림으로 연결되어져 있다.
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
[ Collection의 stream 생성 ]
// String
List<String> list = Arrays.asList("a", "b");
Stream<String> streamList = list.stream();
// Integer
List<Integer> list = Arrays.asList(1,2,3);
Stream<Integer> streamList = list.stream(); // Stream<Integer>
[ 배열의 stream 생성 ]
Stream<T>
에서 T
에는 객체만 입력될 수 있다.// String
Stream<String> stream = Stream.of("a", "b", "c");
Stream<String> stream = Arrays.stream(new String[] {"a", "b", "c"});
// int
int[] arr = {1,2,3};
IntStream stream = Arrays.stream(arr); // IntStream
// Stream<Integer> stream = Stream.of(arr); // 불가능
[ 원시 자료형의 stream 생성 ]
IntStream stream = IntStream.range(4,10);
Stream<T> distinct()
: 중복 제거Stream<T> filter()
: 조건에 맞는 데이터만 필터링map(Function mapper)
: 기존의 stream의 원소를 맵핑한 다음, 새로운 stream으로 형성IntStream mapToInt(Function mapper)
: mapper를 적용한 IntStream을 리턴Stream<T> sorted()
: 인자가 없으면, 오름차순 정렬Stream<T> peek()
: 중간에 결과를 디버깅할 때 사용map()은 원소에 mapper를 적용하여, 그대로 스트림으로 반환하지만,
flatMap()은 중첩 구조를 한 단계 제거한 스트림으로 반환한다. (2차원 배열 -> 1차원 배열)
public class Main {
public static void main(String[] args) {
Stream<String[]> stringArraysStream = Stream.of(
new String[]{"hello", "world", "java"},
new String[]{"chae", "eun"});
stringArraysStream.flatMap(Arrays::stream) // Stream<String>
.peek(System.out::println) // hello, world, java, chae, eun
.map(e-> e.split("")) // Stream<String[]> // hello -> [h, e, l, l, o]
.forEach(e-> System.out.println(Arrays.toString(e)));
}
}
// 출력
hello
[h, e, l, l, o]
world
[w, o, r, l, d]
java
[j, a, v, a]
chae
[c, h, a, e]
eun
[e, u, n]
[참고]
https://stackoverflow.com/questions/26684562/whats-the-difference-between-map-and-flatmap-methods-in-java-8
https://kchanguk.tistory.com/56
https://devjem.tistory.com/41
https://mangkyu.tistory.com/115
숫자와 관련된 메소드들이 존재한다.
ex) sum()
mapToInt()
: 스트림을 IntStream으로 변환int sum = numbers.stream() // 스트림 생성
.filter(number -> number > 4 && (number % 2 == 0)) // 필터링
.mapToInt(number -> number) // IntStream으로 매핑
.sum(); // 총합
reduce()
collect()
: Stream의 요소들을 List, Set, Map 등으로 collect(더 자세한 내용은 추가로 기입해두기)