[Java] Stream

szlee·2022년 6월 9일
0

Java

목록 보기
1/23

Java Stream

Java8 부터 지원되기 시작한 기능. 컬렉션에 저장되어 있는 엘리먼트들을 하나씩 순회하면서 처리할 수 있는 코드패턴. 람다식과 함께 사용되어 컬렉션에 들어있는 데이터에 대한 처리를 간결한 표현으로 작성 가능. 내부 반복자를 사용하므로 병렬처리가 쉽다.





Stream

자바의 스트림을 사용하려면 우선 스트림 객체를 생성해야한다.
컬렉션 객체에서 stream() 메소드를 호출하면 스트림 객체를 만들 수 있다.



Stream 데이터 가공

스트림 객체가 뽑아내는 데이터 중 특정 데이터들만 걸러내거나 데이터에 대해 가공할 수 있다.
데이터를 가공해주는 메소드들은 가공된 결과를 생성해주는 스트림 객체를 리턴한다.



Filter

filter()는 스트림에서 뽑아져 나오는 데이터에서 특정 데이터들만 골라내는 역할을 한다.

  • Predicate : Predicate를 파라미터로 받아서 Predicate가 true인 모든 요소를 포함하는 스트림을 반환하는 메서드

  • Predicate.not() : Predicate 함수형 인터페이스의 static 메서드로 Predicate를 인자로 받아서 그 결과를 반전시키는 메서드



Map

map()은 스트림에서 뽑아져 나오는 데이터에 변경을 가해준다.



Collect

컬렉션의 엘리먼트 중 일부를 필터링하고 값을 변형해서 또 다른 컬렉션으로 만든다.
collect() 메소드를 이용해 뽑아져 나오는 데이터들을 컬렉션으로 모아둘 수 있다.
collect() 메소드에는 Collector 메소드를 사용할 수 있다. Collector 클래스에 있는 정적 메소드를 이용해서 뽑아져나오는 객체들을 원하는 컬렉션으로 만들 수 있다.

  • Collector.toList() : 리스트로 만들기
  • Collector.toSet() : Set으로 만들기



forEach

스트림에서 뽑아져 나오는 값에 대해서 어떤 작업을 하고 싶을 때 forEach()메소드를 사용한다.
어떤 값을 리턴하지는 않는다.



Stream 매칭

매칭 메서드 : 스트림 클래스의 최종 처리 단계에서 요소들이 특정 조건을 만족하는지 조사할 수 있도록 제공한 메서드.

  • allMatch() : 모든 요소들이 매개값(Predicate)으로 주어진 조건을 만족하는지 조사
  • anyMatch() : 최소한 한 개의 요소가 주어진 조건에 만족하는지 조사
  • noneMatch() : 모든 요소들이 주어진 조건을 만족하지 않는지 조사




예시

result : 리스트, filterList : 리스트

result리스트의 각 데이터(값)에서 filterList에 들어있는 값이 하나라도 있는지 조사.

  List<DataMap> returnResult = result.stream()
                                     .filter(x -> finalFilterList.stream()
                                                                 .anyMatch(y -> x.getString("RCVAD1").contains(y))
                                      )
                                     .collect(Collectors.toList());

result리스트의 각 데이터(값)에서 filterList에 들어있는 값이 하나라도 있는지 조사하여 해당하지 않는 것을 리스트로 반환.

  List<DataMap> returnResult = result.stream()
                                     .filter(Predicate.not(x -> finalFilterList.stream()
                                                                               .anyMatch(y -> x.getString("RCVAD1").contains(y)))
                                      )
                                     .collect(Collectors.toList());
  




refer

profile
🌱

0개의 댓글