Java Stream 가공하기
https://beomseok95.tistory.com/216
https://beomseok95.tistory.com/217
가공하기(중개연산)
- Filtering
- Mapping
- Sorting
- Iterating
Stream 가공하기 중개연산
생성단계를 거친 스트림을 가공하는 중간작업을 합니다.
이러한 작업을 거치고 스트림을 다시 리턴하기 때문에 여러 스트림을 붙혀서
chaining 을 할 수 있어 가독성이 좋아지는 장점이 있습니다.
필터링(Filtering)
필터(filter)는 스트림 요소들을 하나씩 평가해서 걸러내는 작업이다.
인자로 받는 Predicate sms boolean을 리턴하는 함수형 인터페이스로 평가식이 들어가게 됩니다.
Stream<T> filter(Predicate<? super T> predicate);
ex)
List<String> names = Arrays.asList("son", "ryu", "kang");
Stream<String> stream = names.stream()
.filter(name -> name.contains("n"));
//result
son,kang
리스트에 n 이 들어간 이름의 스트림이 리턴됩니다.
매핑(Mapping)
맵(map)은 스트림 내 요소들을 하나씩 특정 값으로 변환해줍니다.
이 때 값을 변환하기 위한 람다를 인자로 받습니다.
<R> Stream<R> map(Function<? super T, ? extends R> mapper);
스트림에 들어가 있는 값이 input이 되어서 특정 로직을 거친 후 output이 되어 리턴되는 새로운 스트림에 담기게되고,
이 작업을 맵핑(mapping)이라고합니다.
List<String> names = Arrays.asList("son", "ryu", "kang");
Stream<String> stream = names.stream()
.map(String::toUpperCase);
//result
SON,RYU,KANG
스트림 내 String 의 toUpperCase 메소드를 실행해서 대문자로 변환한 값들이 담긴 스트림을 리턴합니다.
Stream<Integer> stream =
productList.stream()
.map(Product::getAmount);
// [23, 14, 13, 23, 13]
다음처럼 요소 내 들어있는 Product 개체의 수량을 꺼내올 수도 있습니다. 각 ‘상품’을 ‘상품의 수량’으로 맵핑하는거죠.
flatmap
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
인자로 mapper를 받고 있는데, 리턴 타입이 Stream 입니다.
즉, 새로운 스트림을 생성해서 리턴하는 람다를 넘겨야합니다.
flatMap 은 중첩 구조를 한 단계 제거하고 단일 컬렉션으로 만들어주는 역할을 합니다.
이러한 작업을 플래트닝(flattening)이라고 합니다
List<List<String>> list = Arrays.asList(Arrays.asList("a"), Arrays.asList("b"));
String flattenResult =
list.stream()
.flatMap(Collection::stream)
.collect(Collectors.joining(","));
ms.println(flattenResult);
//result
a,b
정렬(Sorting)
정렬은 다른정렬과 마찬가지로 Comparator를 이용하여 정렬할 수 있습니다.
Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);
오름차순 정렬
IntStream.of(14, 11, 20, 39, 23)
.sorted()
.boxed()
.collect(Collectors.toList());
// [11, 14, 20, 23, 39]
내림차순 정렬
IntStream.of(14, 11, 20, 39, 23)
.sorted(Comparator.reverseOrder())
.boxed()
.collect(Collectors.toList());
// [39,23,20,14,11]
Comparator 의 compare 메소드는 두 인자를 비교해서 값을 리턴합니다.
List<String> lang =
Arrays.asList("Java", "Scala", "Groovy", "Python", "Go", "Swift");
lang.stream()
.sorted(Comparator.comparingInt(String::length))
.collect(Collectors.toList());
// [Go, Java, Scala, Swift, Groovy, Python]
lang.stream()
.sorted((s1, s2) -> s2.length() - s1.length())
.collect(Collectors.toList());
// [Groovy, Python, Scala, Swift, Java, Go]
Iterating
스트림 내 요소들 각각을 대상으로 특정 연산을 수행하는 메소드로는 peek가 있습니다.
peek는 그냥 확인해본다는 단어 뜻처럼
특정 결과를 반환하지 않는 함수형 인터페이스 Consumer를 인자로 받습니다.
Stream<T> peek(Consumer<? super T> action);
따라서 스트림 내 요소들 각각에 특정 작업을 수행할 뿐 결과에 영향을 미치지 않습니다. 다음처럼 작업을 처리하는 중간에 결과를 확인해볼 때 사용할 수 있습니다.
int sum = IntStream.of(1, 3, 5, 7, 9)
.peek(System.out::println)
.sum();
'JAVA' 카테고리의 다른 글
Java - 메모리관리 ( 스택& 힙) [펌] (0) | 2019.09.01 |
---|---|
Primitive vs Reference (0) | 2019.09.01 |
Java Stream 결과 만들기 (0) | 2019.09.01 |
Java Stream 생성하기 (0) | 2019.09.01 |
Java Stream알아보기 (0) | 2019.09.01 |
댓글