스트림
스트림이란
스트림은 데이터 소스를 추상화하고, 데이터를 다루는데 자주 사용되는 메서드를 정의해 놓았다.
데이터 소스를 추상화하였다는 것은, 데이터 소스가 무엇이던 간에 같은 방식으로 다룰 수 있게 되었다는 것과,
코드의 재 사용성이 높아 진다는 것을 의미한다.
- 스트림은 데이터 소스를 변경하지 않는다.
- 스트림은 일회용이다. (Iterator 처럼 일회용)
- 스트림은 작업을 내부 반복으로 처리한다
스트림의 연산
스트림이 제공하는 다양한 연산을 이용해서 복잡한 작업들을 간단히 처리할 수 있다.
- 중간연산 : 연산 결과가 스트림인 연산, 스트림에 연속해서 중간 연산 할 수 있음
- 최종연산 : 연산 결과가 스트림이 아닌 연산, 스트림의 요소를 소모하므로 단 한번만 가
스트림 생성
-
배열
String[] array = new String[]{"a", "b", "c"}; Stream<String> stream1 = Arrays.stream(array); Stream<String> stream2 = Arrays.stream(array, 1, 3);Array.stream에 인자로 배열을 입력하면 배열을 순회하는 스트림 객체를 만들 수 있으며, 배열 시작과 종료
인덱스를 주면 일부는 순회하는 객체를 만들 수도 있음.
-
빌더
String<String> stream = Stream<String>builder() .add("Apple") .add("Banana") .add("Melon") .build();배열이나 컬렉션이 아닌 직접 값을 입력해서 스트림 객체를 생성하는 방법
-
Generator
public static<T> Stream<T> generate(Supplier<T> s) { ... } Stream<String> stream = Stream.generate(() -> "Hello").limit(5);람다 식을 이용해서 만드는 스트림 생성
-
lterator
Stream<String> stream = Stream.iterate(100, n -> n + 10).limit(5);
iterate() 메소드를 이용해서 수열 형태의 데이터를 생성
스트림 데이터 가공 (중간연산)
-
Filter , dinstinct
distinct()는 스트림에서 중복된 요소들을 제거하고 filter는 주어진 조건에 맞지 않는 요소를 걸러낸다
-
Map
스트림에서 뽑아져 나오는 데이터에 변경을 가해 준다
Stream<Integer> stream = IntStream.range(1, 10).boxed();
stream.filter(v -> ((v % 2) == 0)) // 짝수 걸러내기
.map(v -> v * 10) // 걸러진 값 10씩 곱하기
.forEach(System.out::println);
- flatMap
flatmap 메소드 인자를 받는 람다 는 리턴 타입 Stream이다. 즉, 새로운 스트림 생성해서 리턴 하는 람다를 인자로 받는다.
List<List<String>> list = Arrays.asLists(Arrays.asList("A", "B", "C"),
Arrays.asList("a", "b", "c"));
List<String> flatList = list.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList()); << 최종연산 값을 변경하여 또다른 컬랙션 생성
// ["A", "B", "C", "a", "b", "c"]
이외 나머지 중간 연산은 아래 표를 참고하

스트림 결과 생성(최종연산)

- 요소의 출력 : forEach()
- 요소의 소모 : reduce()
- 요소의 검색 : findFirst(), findAny()
- 요소의 검사 : anyMatch(), allMatch(), noneMatch()
- 요소의 통계 : count(), min(), max()
- 요소의 연산 : sum(), average()
- 요소의 수집 : collect()