사용자 도구

사이트 도구


java:8:stream

문서의 이전 판입니다!


Java 8 Stream

Stream for Iterable

List<List<Object>> 같은 컬렉션의 컬렉션 Flatten

List<List<Object>> list = ...
List<Object> flat = 
    list.stream()
        .flatMap(List::stream)
        .collect(Collectors.toList());

Null safe stream

public static <T> Stream<T> asStream(Collection<T> collection) {
    return Optional.ofNullable(collection)
        .map(Collection::stream)
        .orElse(Stream.empty());
}
 
public static <T> Stream<T> asStream(T[] array) {
    return Optional.ofNullable(array)
        .map(Arrays::stream)
        .orElse(Stream.empty());
}
 
public static <K, V> Stream<Map.Entry<K, V>> asStream(Map<K, V> map) {
    return Optional.ofNullable(map)
        .map(kvMap -> kvMap.entrySet().stream())
        .orElse(Stream.empty());
}

distinct by key

  • 객체의 특정 field / property 를 통해 distinct를 하려면,
  • 별도 Predicate 선언방식
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>(); // parallel stream에서 호출할까봐 이렇게 한듯.
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }
     
    persons.stream().filter(distinctByKey(p -> p.getName());
  • toMap이용
    // 특정 Key 필드로 Map을 만들되 중복 값은 모두 무시
    persons.stream()
      .collect(toMap(Person::getName, Function.identity(), (p1, p2) -> p1))
      .values();

참고

java/8/stream.1567570739.txt.gz · 마지막으로 수정됨: 2019/09/04 13:18 저자 kwon37xi