[자바의정석]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())
Author And Source
이 문제에 관하여([자바의정석]Java - 람다&스트림(2) #016), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@supark0206/자바의정석Java-람다스트림2-016저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)