Language/Java

[JAVA] 스트림(Stream) - 가공

DuL2 2023. 3. 10. 20:16

 자바 스트림이 생성되었다면 다음과 같은 중간 처리 혹은 가공 과정을 통해 우리가 원하는 결과값을 도출해내야 한다. 이 작업은 다시 Stream을 리턴하므로 여러 작업을 붙여(chaining) 복합적으로 사용할 수 있다.

 

  • filter
  • peek
  • map
  • sorted

 위의 대표적인 처리 과정들을 하나씩 알아보자.

 

Filter

 Filter 메소드는 스트림 요소(Collection)들을 필터링하기 위해 사용된다. 내부적으로는 Predicate를 사용하고 있으며 True 혹은 False로 리턴되는 조건을 입력하므로써 여과시켜주는 기능을 한다.

ArrayList<String> alphabet = new ArrayList<String>(Arrays.asList("a", "b", "c"));

alphabet.stream()
    .filter("b"::equals)    
    .forEach(System.out::println);

// 결과 복수일 경우 하나만 표시할 수도 있다.
alphabet.stream()
    .filter("b"::equals)
    .findFirst()
    .ifPresent(System.out::println);

 

Peek

 peek 메소드는 최종 처리 전에 수행된 결과들을 확인하는 메소드이다. Consumer를 파라미터로 사용하며, 스트림의 결과에는 영향을 주지 않는다.

alphabet.stream()
    .filter("b"::equals)
    .peek(c -> System.out.println("c = " + c))
    .forEach(System.out::println);

 

Map

 Map은 스트림 내 요소를 특정 값으로 변환하는 작업을 수행한다. 내부적으로는 Function을 사용하여 스트림 각 요소를 파라미터로 받아 로직을 수행한 결과로 리턴하게 된다. 다음 예제는 위에서 만들어진 스트림 a, b, c가 대문자 A, B, C로 변환되는 코드이다.

alphabet.stream()
    .parallel()
    .map(String::toUpperCase) // 각 요소를 대문자로 변환
    .forEach(System.out::println);

 

Sorted

 sorted는 뜻 그대로 스트림 내 요소들을 정렬하는 작업을 수행하는 메소드이다. 정렬하기 위해서는 Comparable 인터페이스가 구현되어있어야 한다. 다음 예제는 스트림에 들어있는 알파벳들을 정렬한다.(이미 정렬되어 있기 때문에 표면상으로는 티가 나지 않는다.)

alphabet.stream()
    .sorted()
    .collect(Collectors.toList());