본문 바로가기
JAVA

Java Stream 가공하기

by 봄석 2019. 9. 1.

Java Stream 가공하기

https://beomseok95.tistory.com/216

 

Java Stream알아보기

Java Stream JavaStream이란 ? Java8 부터 추가된 기능으로 ,"컬렉션, 배열등의 저장 요소를 하나씩 참조하며 함수형 인터페이스(람다식)를 적용하며 반복적으로 처리할 수 있도록 해주는 기능"입니다. (InputStre..

beomseok95.tistory.com

https://beomseok95.tistory.com/217

 

Java Stream 생성하기

Java Stream 생성하기 1. 생성하기 배열 , 컬렉션, 빈스트림 Stream.builder() , Stream.generate() , Stream.iterate() 기본타입형 , String , 파일스트림 병렬스트림, 스트림연결하기 배열스트림 , 컬렉션스트림..

beomseok95.tistory.com

가공하기(중개연산)

  • 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

댓글