문서의 선택한 두 판 사이의 차이를 보여줍니다.
양쪽 이전 판 이전 판 다음 판 | 이전 판 | ||
java:8:stream [2017/08/18 13:55] kwon37xi |
java:8:stream [2022/04/09 00:10] kwon37xi [parallelStream] |
||
---|---|---|---|
줄 24: | 줄 24: | ||
===== Null safe stream ===== | ===== Null safe stream ===== | ||
<code java> | <code java> | ||
- | public static <T> Stream< | + | public static <T> Stream< |
- | return Optional.ofNullable(collection).map(Collection:: | + | return Optional.ofNullable(collection) |
+ | | ||
+ | | ||
} | } | ||
- | public static <T> Stream< | + | public static <T> Stream< |
- | return Optional.ofNullable(array).map(Arrays:: | + | return Optional.ofNullable(array) |
+ | | ||
+ | | ||
} | } | ||
+ | public static <K, V> Stream< | ||
+ | return Optional.ofNullable(map) | ||
+ | .map(kvMap -> kvMap.entrySet().stream()) | ||
+ | .orElse(Stream.empty()); | ||
+ | } | ||
+ | |||
+ | </ | ||
+ | |||
+ | ===== Collectors.toMap ===== | ||
+ | * '' | ||
+ | * 보통은 Key 하나에 값이 하나 일 때 사용. | ||
+ | * Key 하나에 값이 여러개가 나오는 충돌에 대해 '' | ||
+ | * 원래 '' | ||
+ | * 이유는 해당 구현 내부적으로 호출하는 '' | ||
+ | |||
+ | ===== Collectors.groupingBy ===== | ||
+ | * '' | ||
+ | |||
+ | ===== distinct by key ===== | ||
+ | * 객체의 특정 field / property 를 통해 '' | ||
+ | * [[https:// | ||
+ | public static <T> Predicate< | ||
+ | Map< | ||
+ | return t -> seen.putIfAbsent(keyExtractor.apply(t), | ||
+ | } | ||
+ | |||
+ | persons.stream().filter(distinctByKey(p -> p.getName()); | ||
+ | </ | ||
+ | * '' | ||
+ | // 특정 Key 필드로 Map을 만들되 중복 값은 모두 무시 | ||
+ | persons.stream() | ||
+ | .collect(toMap(Person:: | ||
+ | .values(); | ||
+ | </ | ||
+ | |||
+ | ===== parallelStream ===== | ||
+ | * [[https:// | ||
+ | * '' | ||
+ | * DB 조회/API 호출 처럼 순차보다는 병렬이 확실히 더 확실할 때 빼고는 '' | ||
+ | * 그리고 Thread 안정성도 보장해줘야한다. | ||
+ | * 따라서 성능테스트로 완벽하게 더 좋은 성능이 보장되지 않는다면, | ||
+ | |||
+ | ===== unmodifiable, | ||
+ | * [[https:// | ||
+ | |||
+ | <code java> | ||
+ | List< | ||
+ | | ||
+ | | ||
+ | Collections:: | ||
+ | </ | ||
+ | * [[https:// | ||
+ | |||
+ | <code java> | ||
+ | List< | ||
+ | .boxed() | ||
+ | .collect(ImmutableList.toImmutableList()); | ||
+ | </ | ||
+ | |||
+ | <code java> | ||
+ | // Generic Immutable Collection collector 만들기. 컬렉션 구현체를 원하는대로 선택 | ||
+ | public static <T, A extends List< | ||
+ | Supplier< | ||
+ | | ||
+ | return Collector.of( | ||
+ | supplier, | ||
+ | List::add, (left, right) -> { | ||
+ | left.addAll(right); | ||
+ | return left; | ||
+ | }, Collections:: | ||
+ | } | ||
+ | |||
+ | // 사용예 - LinkedList 구현을 unmodifiable로 감싸기 | ||
+ | List< | ||
+ | List< | ||
+ | .collect(MyImmutableListCollector.toImmutableList(LinkedList:: | ||
</ | </ | ||
+ | * '' | ||
+ | ===== 참고 ===== | ||
+ | * [[https:// | ||
+ | * [[https:// | ||