-
[Java 8] StreamJAVA 2021. 8. 28. 14:07728x90
스트림 (Stream)
- 스트림이란'데이터의 흐름'
- Java 8 에서 추가된 스트림은 람다를 활용할 수 있는 기술
- Java 8 이전에는 배열 또는 컬렉션 인스턴스를 다루는 방법은 for 또는 foreach 문을 돌면서 요소 하나씩 꺼내서 다루는 방법을 사용
- 장점
- 배열 또는 컬렉션 인스턴스에 함수 여러 개를 조합해서 원하는 결과를 필터링하고 가공된 결과를 얻을 수 있으며, 람다를 이용하여 코드 양을 줄일 수 있음
- 병렬처리 (multh-threading) 가능하여 빠르게 처리 가능
생성하기
- 배열 스트림 : Arrays.stream 메소드
- 컬렉션 스트림 : 컬렉션 타입 (Collection, List, Set) 인터페이스의 stream 메소드
- Stream.builder() / Stream.generate() / Stream.iterate()
- 기본 타입 (IntStream, LonngStream, DoubleStream) / String / 파일 스트림
- 병렬 스트림 : paralleStream 메소드
- 스트림 연결하기 : Stream.concat apthem
가공하기 - intermediate operations
- Stream<T> filter(Predicate<? super T> predicate) : 스트림 내 요소들을 하나씩 평가해서 걸러내는 작업
Stream<String> stream = names.stream() .filter(name -> name.contains("a")); // [Elena, Java]
- <R> Stream<R> map(Function<? super T, ? extends R> mapper) : 스트림 내 요소들을 하나씩 특정 값으로 변환
Stream<String> stream = names.stream() .map(String::toUpperCase); // [ERIC, ELENA, JAVA]
- Stream<T> sorted() / Stream<T> sorted(Coparator<? super T> comparator)
- Stream<T> peek(Consumer<? super T> action) : 스트림 내 요소들 각각을 대상으로 특정 연산을 수행. Consumer를 인자로 받아, 각각에 특정 작업을 수행할 뿐 결과에 영향을 미치지 않음.
결과 만들기 - terminal operations
- Calculating : 스트림 API 는 다양한 종료작업 제공 (count(), sum(), min(), max(), average() 등)
- Reduction : redouce 메소드
- Collecting : collect 메소드로 Collector 타입의 인자를 받아 처리 (Collectors : toList, joining, averageingInt, summingInt, groupingBy 등 )
- Matching : 조건식 람다 Predicate를 받아서 해당 조건을 만족하는 요소가 있는지 체크한 결과 리턴
List<String> names = Arrays.asList("Eric", "Elena", "Java"); boolean anyMatch = names.stream() .anyMatch(name -> name.contains("a")); // true boolean allMatch = names.stream() .allMatch(name -> name.length() > 3); // true boolean noneMatch = names.stream() .noneMatch(name -> name.endsWith("s")); // true
- forEach : 요소를 돌면서 실행되는 최종 작업. 중간작업의 peek 과 동일
참고
728x90