스트림 part3(최종연산,collector)

Shaun·2021년 9월 18일
1

JAVA

목록 보기
27/30

forEach() , forEachOrdered()

  • 스트림은 기본 직렬스트림 이다.
  • 병렬 스트림은 parallel().foreach() //병렬이라 순서보장 x
  • paralle().foreachOrederd() //병렬 +순서보장

조건검사-allMatch() ,anyMatch(),noneMatch(), findFirst(), findAny()

boolean allMatch (Predicate <? super T>predicate)// 모든요소가 만족 =true
boolean anyMatch (Predicate <? super T>predicate)//한 요소라도
boolean noneMatch (Predicate <? super T>predicate)// 모든요소가 만족 x=true

ex)
boolean noFailed= stuStream.anyMatch(s->s.getTotalScore<=100)

Optional<Student> stu = stuStream.filter(s->s.getTotalScore).findFirst();

Optional<Student> stu = parallelStream.filter(s->s.getTotalScore).findAny();

  • filterfindFirst 랑 주로 같이 쓰인다.
  • 병렬 스트림은 findFirst 대신에 findAny사용
  • 결과가 Optional<T.> ====결과가 null일수도 있으니까

통계 count(),sum(),average(),max,min()

  • IntStream과 같은 기본형 스트림에서는 다 쓸수 있지만 기본형 외 스트림들은 count(), max(),min() 만 사용 가능.

리듀싱-reduce()

  • 스트림의 요소를 줄여가면서 연산을 수행하고 최종결과를 반환한다.

  • 스트림의 최종연산은 reduce에서 만들어 졌다.

1.Optional<T.> reduce(BinaryOperator<T.> accumulator)
// 스트림이 비어있을수도 있으니 optional, / 초기값 없다

2.T reduce(T identity, BinaryOperator<T.>accumulator)
// 스트림이 비어도 초기값 T반환 , /초기값 있다

3.reduce(초기값, 수행할연산)

int count =intStream.reduce(0,(a,b)->a+1); //count()
int sum = intStream.reduce(0,(a,b)->a+b) l //sum()
int max = intStream.reduce(Integer.MIN_VALUE,(a,b)->?a:b) //max()
int min =intStream.reduce(Integer.MAX_VALUE,(a,b)->a<b?a:b) //min()

reduce() 가 내부적으로 어떻게 동작하는지 파헤쳐보자 . reduce()로 스트림의 모든 요소를 다더하는 과정 이다

1.int a = identity; //초기값을 a에저장

2.for(int b :stream) //모든 요소의 값을 a에 누적한다
a=a+b;

collect()

  • collect 는 리듀싱과 유사하다. colect는 그룹별 리듀싱/reduce()는 전체 리듀싱

collect() = 스트림의 최종연산, 매개변수로 컬렉터를 필요로한다
Collector = 인터페이스, 컬렉터는 이 인터페이스를 구현해야한다
Collectors = 클래스 , static메서드로 미리 작성된 컬렉터를 제공한다

스트림 -> 컬렉션/배열

  • toList(),/ toSet(),/ toMap(), /toCollection(), /toArray()

  • 스트림의 요소를 컬렉션에 수집하려면 toList()와 같은 메서드 사용. list나 set이아닌 특정 컬렉션 지정하려면 toCollection()에 해당 컬렉션의 생성자 참조를 매개변수로 넣어주면 된다

ex)

  1. List<String.> names= stsStream.map(Student::getName)
    .collect(Collectors.toList());
  1. ArrayList<String.> list= names.stream()
    .collect(Colectors.toCollection(ArrayList::new)); //특정 컬렉션에 넣기

  2. Map<String,Perosn> map = personStream
    .collect(Collectors.toMap(p->p.getId(), p->p));

  3. Student[] stuNames = studentStream.toArray(Student[]::new)
    ->toArray는 반환타입이 Objectp[]

통계

  • counting() /summingInt() / averagingInt()/maxBy()/minBy()

  • 일반 스트림과는 전체/그룹별 로 계산한다는 차이가 있다.

  • 사용법은 위에 예시들처럼
    스트림.collect(Collectors.메서드(람다))이다.

문자열 결합

  • joining()

  • 문자열 스트림의 모든 요소를 하나의 문자열로 연결해서 반환한다.

  • 스트림의 요소가 문자열이 아닌경우에는 먼저 map() 로 문자열로 변환한뒤 사용한다.

ex

String studentNames= stuStream.map(Student::getName)
.collect(Collectors.joining());

profile
호주쉐프에서 개발자까지..

0개의 댓글