Java Stream
은 Java 8부터 지원되는 기능으로 Collection
에 저장된 항목들을 하나씩 순회하면서 처리할 수 있는 방식이다.
람다와 함께 사용되며 Colletion
데이터 처리를 간결하게 할 수 있고, 내부 반복자를 사용하여 병렬 처리가 쉽다는 장점이 있다.
=> 컬렉션, 배열등의 저장 요소를 하나씩 참조하며 람다식을 적용하여 반복적으로 처리할 수 있도록 해주는 기능
기존 코드
for(String value : list){
if(StringUtils.equals(value, "A")) {
System.out.println(value);
}
}
스트림 적용
list.stream()
.filter("A"::equals)
.forEach(System.out::println);
filter
는 스트림의 엘리먼트를 하나씩 평가하여 조건에 맞도록 데이터를 필터링 할 수 있다.
Stream<T> filter(java.util.function.Predicate<? super T> predicate)
filter에는 boolean 값
을 리턴하는 람다식을 매개변수로 넘겨주면 되고, 람다식을 적용하여 true값이 리턴되는 데이터만 선별된다.
예시
Stream<String> stream = orgNameList.stream()
.filter(name -> name.contains("X"));
스트림의 엘리먼트를 특정 조건에 해당하는 값으로 변환할 수 있다.
Stream<R> map(java.util.function.Function<? super T, ? extends R> mapper)
map에는 함수형 인터페이스 function을 매개변수로 넘겨주면 되고,
예시
Stream<String> stream = orgNameList.stream()
.map(name -> name.toUpperCase());
스트림의 엘리먼트를 정렬하기 위해서 sorted를 사용한다. 파라미터로 Comparator를 넘길 수 있고 넘기지 않을 때 디폴트값은 오름차순이다.
예시
Stream<String> stream = orgNameList.stream()
.sorted();
2번의 중간 연산 과정을 거치게 되면 Stream이 생성된다. 이러한 Stream의 결과값을 만들기 위해 최종 연산이 필요하다.
Stream 요소를 List나 Set, Map 등의 Collection 결과로 만들고 싶을 경우에 collect
를 사용한다.
collect(java.util.stream.Collector<? super T, A, R> collector
예시
List<String> mapNameList = orgNameList.stream()
.sorted()
.collect(Collectors.toList());
Collectors.groupingBy()
Stream 작업 결과를 특정 그룹으로 묶을 수 있다.
이 결과는 Map으로 반환된다.
특정 컬럼을 기준으로 데이터를 묶을 때 용이하게 사용할 수 있다.
Map<Long, List<Dto>> mapList = list.stream()
.collect(Collectors.groupingBy(Dto::getId))
Collectors.joining(delimiter, prefix, suffix)
Stream 요소가 특정 조건을 충족하는지 검사할 때 사용한다.
Predicate
를 받아서 조건식을 검사하고 그 결과를 boolean
형태로 반환한다.
anyMatch: 1개의 요소라도 조건을 만족하면 True
allMatch: 모든 요소가 조건을 만족하면 True
nonMatch: 모든 요소가 조건을 만족하지 않으면 True
Stream 요소를 대상으로 특정 연산을 수행할 때 forEach
를 사용한다.
최종 연산으로써 각 요소에 영향을 미칠 수 있으며 반환값은 존재하지 않는다.