2017-11-04 1 views
5

Java 스트림을 사용하는 방법을 배우고 중첩 된 콜렉션을 스트리밍하고 콜렉션으로 결과를 다시 수집하는 방법을 이해해야합니다.Java 스트림 : 중첩 된 콜렉션을 수집하십시오.

아래의 간단한 예제에서 2 개의 ArrayList를 만들고 ArrayList에 추가했습니다. 각 중첩 된 컬렉션에 대해 간단한 함수를 수행 한 다음 결과를 새 컬렉션으로 캡처 할 수 있기를 원합니다. 코드의 마지막 줄은 컴파일되지 않습니다. 모든 설명을 부탁드립니다!

ArrayList<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1,2,3)); 
    ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(4,5,6)); 

    ArrayList<ArrayList<Integer>> nested = new ArrayList<ArrayList<Integer>>(); 
    nested.add(list1); 
    nested.add(list2); 

    ArrayList<ArrayList<Integer>> result = nested.stream() 
      .map(list -> list.add(100)) 
      .collect(Collectors.toList()); 
+0

정확히 무엇을 원하십니까? 당신의'nested.stream()'은'Stream >'를 반환 할 것이고 따라서 여러분은 예상대로 각 중첩리스트를 조작 할 수 있습니다. 아니면 이것을 "Stream "으로 변환하여 중첩 목록의 각 요소를 조작 할 수 있습니까? –

+0

Collectors.toList()는 목록을 만드는 데 사용됩니다. ArrayList가 아닙니다. 구현이 아닌 인터페이스에 프로그램하십시오. 또한 반복되는 요소를 스트림으로 변경하면 안됩니다. 그것은 스트림이있는 것이 아닙니다. –

+0

'List'의 add 메소드는 반환 값 타입이'boolean'이므로'.map (list -> list.add (100))'은'Stream '을 리턴 할 것입니다. –

답변

1

문제는 List#addList를 반환하지 않는다는 것입니다.

List<ArrayList<Integer>> result = nested.stream() 
     .map(list -> { 
      list.add(100); 
      return list; 
     }) 
     .collect(Collectors.toList()); 

또는 ArrayList가 변경할 수 있기 때문에 당신은 map를 사용하여 생략하고 forEach를 사용하여 수행 할 수 있습니다 : 대신 매핑 한 후 목록을 반환해야

nested.forEach(list -> list.add(100)); 
0

당신은이 작업을 수행 할 Stream.of()을 사용할 수 있습니다 사전에 중첩 된 구조를 만들지 않아도됩니다.

 List<ArrayList<Integer>> nestedList = Stream.of(list1, list2) 
      .map(list -> {list.add(100); return list;}) 
      .collect(Collectors.toList()); 

지도 작업을 별도의 기능으로 추출 할 수도 있습니다.