[자바의정석]Java - 람다&스트림(2) #016

스트림의 연산

스트림의 연산

  • 중간연산: 연산결과가 스트림인 연산 '반복적'적용가능
  • 최종연산: 연산결과가 스트림이 아닌 연산 '한번만'적용가능
    최종연산 이후에는 스트림이 닫힘 최종연산 이후 작업은
    스트림을 새롭게 생성해야한다

중간 연산 종류

  • Stream< T > distinct() : 중복을 제거
  • Stream< T > filter(Predicate< T > predicate) : 조건에 안맞는 요소 제거
  • Stream< T > limit(long maxSize) : 스트림의 일부를 잘라낸다
  • Stream< T > skip(long n) : 스트림의 일부를 건너 뛴다
  • Stream< T > peek(Consumer< T > action): 스트림의 요소에 작업수행
  • Stream< T > sorted(),(Comparator< T > comparator): 스트림의 요소를 정렬
  • Stream< R > map(람다식),flatMap(람다식): 스트림의 요소를 변환한다

최종 연산 종류

  • void forEach(),
    병렬스트림 순서유지해야 될 때forEachOrdered()
    : 각요소에 지정된 작업 수행
  • long count() : 스트림의 요소의 개수 반환
  • Optional< T > max(정렬기준),min() : 최대값 최소값 반환
  • Optional< T > findAny() : 아무거나 하나를 반환
  • Optional< T > findFirst() : 첫번째 요소를 반환
  • boolean allMatch,anyMatch,noneMatch(조건식) :
    모두만족,하나라도 만족,모두 만족하지 않는지 확인한다
  • Object[] toArray() : 스트림의 모든 요소를 배열로 반환
  • 핵심
  • Optional< T > reduce()
    T reduce() , U reduce() : 스트림의 요소를 하나씩 줄여가면서 계산한다
  • R collect() : 스트림의 요소를 수집한다 , 주로 요소를 그룹화하거나
    분할한 결과를 컬렉션에 담아 반환한느데 사용된다

스트림의 중간연산

스트림 자르기

  • Stream< T > limit(long maxSize) : 스트림의 일부를 잘라낸다
  • Stream< T > skip(long n) : 스트림의 일부를 건너 뛴다

스트림의 요소 걸러내기

  • Stream< T > filter(조건식) : 조건에 맞지 않는 요소 제거
  • Stream< T > distinct() : 중복제거

스트림 정렬하기

  • Stream< T > sorted() : 스트림 요소의 기본 정렬로 정렬
  • Stream< T > sorted(정렬기준) : 지정된 Comparator로 정렬

Comparator의 comparing()으로 정렬 기준 제공

  • Comparator comparing(람다식)
  • 추가 정렬기준 제종 : thenComparing()을 사용한다

스트림의 요소 변환-map

  • Stream< T > 가 Stream< R >로 바뀌게 해줌
  • ex) 파일 스트림에서 이름만 뽑아서 스트림 스트림으로 변환

스트림의 요소를 소비하지 않고 엿보기-peek

  • Stream< T > peek(action)
  • 중간중간 작업결과를 확인할때 사용한다

스트림의 스트림을 , 스트림으로 변환-flatMap()

  • 그냥 맵을 썼을때 출력결과

Optional< T >

T타입 객체의 래퍼 클래스-Optional< T >

  • 모든 종류의 객체를 저장할 수 있다 null 도 저장가능
  • 필요한 이유? null을 Opitonal객체에 담아 사용하기위해서
    1.null을 직접다루는 것은 위험하기 때문에 NullPointException
    2.null체크 if문 필수 그래서 코드가 지저분해짐

Optional< T >객체 생성하기

  • Optional< T >객체를 생성하는 다양한 방법
	String str = "abc";
   	Optional<String> optVal = Optional.of(str);
    Optional<String> optVal = Optional.of("abc");
    Optional<String> optVal = Optional.ofNullable(null);
    //빈 Optional<T>객체생성
    Optional<String> optVal = Optional.<String>empty();
    Optional<String> optVal = Optional.empty();

Optional< T >객체의 값 가져오기

  • Optional객체의 값 가져오기 -
    Optional<String> optVal = Optional.of("abc");
	optVal.get() //저장된 값을 반환 null이면 예외발생
	optValor.Else("") //저장된 값이 null일때는 ""반환
	optVal.orElseGet(String::new)//람다식 사용가능하게함
	optVal.orElseThrow(NullPointerException::new)//널이면 예외발생
  • isPresent() : Optional객체의 값이 null이면 false,아니면 true반환

기본형 값을 감싸는 래퍼클래스

  • OprionalInt , OptionalLong , OptionalDouble
  • 성능 향상을 위해서 사용한다

스트림의 최종연산에 대한 강의

스트림의 모든 요소에 지정된 작업을 수행

  • forEach()
  • forEachOrdered() 병렬스트림인 경우에도 순서가 보장됨

스트림의 최종연산-조건검사

  • allMatch() 모든 요소가 조건을 만족시키면 true
  • anyMatch() 한 요소라도 조건을 만족하면 true
  • noneMatch() 모든 요소가 조건을 만족시키지 않으면 true

조건에 일치하는 요소 찾기

  • findFirst() 첫번째 요소를 반환 , 순차 스트림에 사용
  • findAny() 아무거나 하나를 반환 , 병렬 스트림에 사용

(중요)최종연산-reduce()

  • 스트림의 요소를 하나씩 줄여가며 누적연산 수행한다
  • T reduce(T identy, BinaryOperator< T > accumulator)
  • identity:초기값
  • accumulator:이전 결과와 스트림 요소에 수행할 연산
  • combiner: 병렬처리된 결과를 합치는데 사용할 연산 (자주x)

최종연산-collect()

  • 그룹별로 리듀싱
  • Collector를 매개변수로하는 최종연산

Collector는 수집에 필요한 메서드를 정의해 놓은 인터페이스

  • supplier() : 누적할 곳
    accumulator() : 누적방법
    combiner() : 결합방법
    finisher() : 최종변환
    charactoeristics() : 컬렉터의 특성이 담긴 Set을 반환

Collectors 클래스는 다양한 기능의 컬렉터를 제공

  • 변환
  • 통계
  • 문자열 결합
  • 리듀싱
  • 그룹화와 분할

스트림을 컬렉션으로 변환

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

스트림을 배열로 변환

  • toArray()

스트림의 통계

  • counting(),summingInt(),maxBy(),minBy()

스트림을 리듀싱

  • Collector reducing(T identity,BinaryOperator< T >)
  • 그룹별 sum(),count()같은게 가능하게 해진다

문자열 스트림의 요소를 모두 연결

  • joining()

스트림의 그룹화와 분할

스트림 그룹화와 분할

  • partitioningBy() 는 스트림을 '2분할'
  • grupingBy()는 스트림을 'n분할'

2분할

  • partitioningBy()
  • 2분할 한걸 또 2분할 할수있음 다분할
	//학생들을 성별로 분할
	Map<Boolean,List<Student>> stuBySex = stuStream
    	.collect(partitioningBy(Student::isMale));

n분할

  • groupingBy(Function classifier, Collector downstream)
  • key,value를 통해 n분할함
	Map<Integer,List<Student>> stuByBan = stuStream
    	.collect(groupingBy(Student::getBan.toList())

좋은 웹페이지 즐겨찾기