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