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


80

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

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를 사용하여 어떻게 생각하십니까?


병합의 의미에 대한 예를 제공 할 수 있습니까? 당신의지도가라고 말하고 {a: [1,2], b[3,4]}, 그들을 연결하거나, [1,2,3,4]목록의 목록을 만들 [[1,2],[3,4]]거나, 또는 압축 [[1,3],[2,4]]하시겠습니까? 또한지도에는 순서가 없다는 것을 알고 있습니까?
tobias_k

@tobias_k 결과가 [1,2,3,4]정렬되지 않았 으면합니다 !
mat_boy apr

경우 ListContainer에만이 랩 List<T>당신은 대체 할 수 Map<Key, ListContainer>Map<Key, List<T>>
ThePyroEagle

답변:


169

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

예를 들면 :

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

2
? .flatMap(Collection::stream)여기서 불가능한 이유를 설명하는 댓글이 삭제 된 이유 는 무엇입니까?
Puce

좋은 질문 @Puce, 그러나 그것은 가능한 종류-의의 : 경우 ListContainer(즉에 대한 게터을 가지고 캡슐화 lst), 당신은 분해 할 수 .flatMap(->).map(ListContainer::getLst) .flatMap(Collection::stream)
TWiStErRob

3
@TWiStErRob 예, 그것이 제가 원래 댓글에 썼던 것입니다. 왜 삭제 되었나요?
Puce 2011

@ 대답에 왜 .flatMap(Collection::stream)불가능한 지를 설명하는 메모를 넣으면 더 좋을 것이라고 생각합니다. 더 영구적이어야합니다.
SQB

1
@Alex 예, 이것은 한 가지 방법입니다. .map(listContainer -> listContainer.lst).filter(Objects::nonNull).flatMap(Collection::stream)
Puce

55

대안 : Stream.concat ()

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

2
이 질문에 대답하지 않더라도 플러스 1, 그것은 질문의 제목에 응답
토니 BenBrahim

2

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


1

위에서 이미 답변했지만 취할 수있는 또 다른 접근 방법이 있습니다. 나는 이것을 수정 한 원본 게시물을 찾을 수 없지만 여기에 귀하의 질문에 대한 코드가 있습니다. 위에서 언급했듯이 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());
   }
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.