[java] 자바 8 : 스트림 API로 목록 병합

나는 다음과 같은 상황이 있습니다

Map<Key, ListContainer> map;

public class ListContainer{
  List<AClass> lst;
}

지도 lst에서 ListContainer개체의 모든 목록을 병합해야합니다 Map.

public static void main(String args[]){
   List<AClass> alltheObjectsAClass = map.values().stream(). // continue....    
}

Java 8 스트림 API를 사용하여 어떻게 생각하십니까?



답변

나는 flatMap()당신이 찾고있는 것이라고 생각 합니다.

예를 들면 :

 List<AClass> allTheObjects = map.values()
         .stream()
         .flatMap(listContainer -> listContainer.lst.stream())
         .collect(Collectors.toList());


답변

대안 : Stream.concat ()

Stream.concat(map.values().stream(), listContainer.lst.stream())
                             .collect(Collectors.toList()


답변

Java 8에서는 스트림 List1.stream (). collect (Collectors.toList ()). addAll (List2); 다른 옵션 List1.addAll (List2)


답변

위에서 이미 답변했지만 취할 수있는 또 다른 접근 방법이 있습니다. 나는 이것을 수정 한 원본 게시물을 찾을 수 없지만 여기에 귀하의 질문에 대한 코드가 있습니다. 위에서 언급했듯이 flatMap () 함수는 Java 8에서 활용하고자하는 것입니다. 유틸리티 클래스에이를 던져 “RandomUtils.combine (list1, list2, …);”을 호출 할 수 있습니다. 모든 값이 포함 된 단일 목록을 얻게됩니다. 와일드 카드에주의하십시오. 덜 일반적인 방법을 원하면이를 변경할 수 있습니다. Set에 대해 수정할 수도 있습니다. Set 인터페이스의 특성으로 인해 equals / hashCode 메서드에서 데이터 손실을 방지하기 위해 집합에서 flatMap ()을 사용할 때주의해야합니다.

  /**
    * Combines multiple lists into a single list containing all elements of
    * every list.
    *
    * @param <T> - The type of the lists.
    * @param lists - The group of List implementations to combine
    * @return a single List<?> containing all elements of the passed in lists.
    */
   public static <T> List<?> combine(final List<?>... lists) {
      return Stream.of(lists).flatMap(List::stream).collect(Collectors.toList());
   }


답변