[Java] Stream 활용하기

DAUN JO·2022년 6월 15일
0

TIL

목록 보기
17/17

Java Stream 활용하기

1. Stream 이란?

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);



2. Stream 가공하기

filter

filter는 스트림의 엘리먼트를 하나씩 평가하여 조건에 맞도록 데이터를 필터링 할 수 있다.

Stream<T> filter(java.util.function.Predicate<? super T> predicate)

filter에는 boolean 값을 리턴하는 람다식을 매개변수로 넘겨주면 되고, 람다식을 적용하여 true값이 리턴되는 데이터만 선별된다.


예시

Stream<String> stream = orgNameList.stream()
    .filter(name -> name.contains("X"));



map

스트림의 엘리먼트를 특정 조건에 해당하는 값으로 변환할 수 있다.

Stream<R> map(java.util.function.Function<? super T, ? extends R> mapper)

map에는 함수형 인터페이스 function을 매개변수로 넘겨주면 되고,


예시

Stream<String> stream = orgNameList.stream()
    .map(name -> name.toUpperCase());



sorted

스트림의 엘리먼트를 정렬하기 위해서 sorted를 사용한다. 파라미터로 Comparator를 넘길 수 있고 넘기지 않을 때 디폴트값은 오름차순이다.


예시

Stream<String> stream = orgNameList.stream()
    .sorted();



3. Stream 최종 연산

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 작업 결과를 한 문자열로 이어 붙일 때 이용할 수 있다.
    - delimiter : 각 요소 중간에 들어가 요소를 구분시켜주는 구분자
    - prefix : 결과 맨 앞에 붙는 문자
    - suffix : 결과 맨 뒤에 붙는 문자

match

Stream 요소가 특정 조건을 충족하는지 검사할 때 사용한다.
Predicate를 받아서 조건식을 검사하고 그 결과를 boolean 형태로 반환한다.

anyMatch: 1개의 요소라도 조건을 만족하면 True
allMatch: 모든 요소가 조건을 만족하면 True
nonMatch: 모든 요소가 조건을 만족하지 않으면 True


forEach

Stream 요소를 대상으로 특정 연산을 수행할 때 forEach를 사용한다.
최종 연산으로써 각 요소에 영향을 미칠 수 있으며 반환값은 존재하지 않는다.

profile
🍕

0개의 댓글