JAVA/Java
Java 8 Stream
dodop
2022. 1. 14. 12:09
자바 8부터 지원하는 Stream은 컬렉션, 배열 등에 대해서 요소들을 하나씩 참조하여 반복적 처리를 하는 기능이다.
스트림은 내부 반복을 통해서 작업을 처리하기 때문에 for문을 사용하는 것 보다 간결하게 식을 표현할 수 있다.
Stream
스트림의 특징은 다음과 같다.
- 원래의 데이터를 읽기만 할 뿐 기존 데이터를 변경하지 않음
- 일회성이므로 재사용이 불가능하다. 필요하다면 정렬된 결과를 반환하도록 한다. (스트림의 생성을 반복적으로 이용하면 연속적으로 사용할 수 있다)
- 스트림 생성, 중개연산, 최종연산 의 구조를 지니고 있다. ( 스트림생성().중개연산().최종연산() )
- 병렬 스트림은 여러 쓰레드가 작업한다. (parallelStream()으로 병렬 스트림 작성 시 parallelStream().filter(연산).count() 와 같이 사용되며 이 경우 여러 쓰레드가 스트림 요소를 필터링 하고 결과를 쓰레드 끼리 한번 더 각자 계산한 count값을 더해서 리턴한다. 쓰레드가 많거나 스트림 요소 수가 많지 않다면 오히려 쓰레드를 사용 시 드는 오버헤드가 더 발생할 수 있다.)
스트림 생성
스트림 API는 다양한 데이터 소스에서 생성할 수 있다.
- 컬렉션
- 배열
- 가변 매개변수
- 지정된 범위의 연속된 정수
- 특정 타입의 난수
- 람다 표현식
- 파일
- 빈 스트림
중개 연산
//filter()
List<String> fruits = Arrays.asList("apple", "banana", "peach", "grape");
Stream<String> stream = fruits.stream().filter(x -> x.contains("b"));
//banana
//distinct()
List<Integer> nums = Arrays.asList(1, 2, 2, 1);
Stream<Integer> stream =nums.stream().distinct().forEach(n -> System.out.print(n));
//1, 2
//map()
List<String> fruits = Arrays.asList(new ArrayList"apple", "banana", "peach", "grape");
fruits.stream()
.map(x -> x.concat("s"))
.forEach(x -> System.out.println(x));
//apples, bananas, peachs, grapes
//limit(), skip()
List<Integer> nums = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
nums.skip(2).forEach(n -> System.out.print(n));
//3, 4, 5, 6, 7
nums.limit(2).forEach(n -> System.out.print(n));
//1, 2
//sort()
List<String> fruits = Arrays.asList("apple", "banana", "peach", "grape");
fruits.stream().sorted().forEach(f -> System.out.print(f));
//apple, banana, grape, peach
중개연산으로 사용되는 함수는 다음과 같다.
- 필터링 : filter(), distinct()
- 변환 : map(), flatMap() ( 여기서 map은 입력한 원소를 그대로 스트림으로 반환하지만 flatMap()은 원소를 가장 작은 단위의 단일 스트림으로 반환한다 )
- 제한 : limit(), skip()
- 정렬 : sorted() ( sorted() 반복이 가능하여 다른 중개연산과의 사용이 가능하다 )
- 결과 확인 : peek()
최종 연산
최종 연산은 지연되었던 모든 중개연산들이 모두 수행되는 시점이며 최종 연산 후에는 stream은 더이상 사용할 수 없다.
- 출력 : forEach()
- 소모 : reduce()
- 검색 : findFirst(), findAny()
- 검사 : anyMatch(), allMatch(), noneMatch()
- 통계 : count(), min(), max()
- 연산 : sum(), average()
- 수집 : collect()
(참고한 사이트)
https://ahndding.tistory.com/23
https://jeong-pro.tistory.com/165