사용자 도구

사이트 도구


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());
}

distinct by key

  • 객체의 특정 field / property 를 통해 distinct를 하려면,
  • 별도 Predicate 선언방식
    public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        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.txt · 마지막으로 수정됨: 2017/11/07 14:48 저자 kwon37xi