[Stream: one Group ]
.stream().collet( Collectors.groupingBy(Function.identity(), Collectors.count() ),
Grouping
Map<BigDecimal, List<Item>> groupByPriceMap = items.stream().collect(Collectors.groupingBy(Item::getPrice));
Map<BigDecimal, Set<String>> result = items.stream().collect( Collectors.groupingBy(Item::getPrice, Collectors.mapping(Item::getName, Collectors.toSet()) ) );
[List -> Map]
Map<String, Choice> result = choices.stream().collect(Collectors.toMap(Choice::getName, Function.identity()));
[2 field Grouping]
Map<String, Map<String, Long>> multipleFieldsMap = employeesList.stream()
.collect(
Collectors.groupingBy(Employee::getDesignation,
Collectors.groupingBy(Employee::getGender, Collectors.counting())
));
===========================O======================
.orElse(blabla) empty일때 값지정.
.map( function) 존재할때 함수실행.
-boolean isPresent()
내부객체가 null이 아닌지 확인한다. null이면 false를 반환한다.
-void ifPresent(Consumer<T>)
Consumer<T>는 함수형 인터페이스 포스팅에서 봤듯 void 추상메서드를 갖고있다. null이 아닐때만 실행된다.
-Optional<T> filter(Predicate<T>)
스트림은 여러 데이터를 들고있는 객체다보니 filter로 걸러지는 데이터들이 반환됐지만, Optional은 내부객체가 단일객체인만큼 해당 조건을 만족하는지만 확인하는 정도로 사용할 수 있을 것 같다.
-Optional<U> map(Function<T, U>)
스트림과 같다. 내부 객체를 변환하는 용도로 사용한다.
-T get()
내부 객체를 반환한다. 다만 내부 객체가 null이면 NPE가 발생한다. null이 아니라는 확실한 경우에만 사용을 권장한다.
-T orElse(T)
내부 객체를 반환한다. 내부 객체가 null이면 인자로 들어간 기본값을 반환한다.
-T orElseGet(Supplier<T>)
orElse()와 동일한데 orElse()가 기본값 레퍼런스를 인자로 받는다면 orElseGet()은 내부 객체가 null일때 기본값을 반환할 객체를 인자로 받는다.
-T orElseThrow(Supplier<U>)
출처: http://multifrontgarden.tistory.com/131 [우리집앞마당]