Java 8集合流 - 将列表转换为Set,转换结果

Igo*_*nyi 3 java collections java-stream

成像对象采用以下方法:

class A { List<B> getIds(){...} }
Run Code Online (Sandbox Code Playgroud)

现在我有一个A的集合作为输入; 而且我希望得到一组独特的ID,通常你会选择:

Set<B> ids = new HashSet<>();
for(A a : input){
  ids.addAll(a.getIds());
}
Run Code Online (Sandbox Code Playgroud)

有没有办法使用流API在一行中执行相同操作,如下所示

Set<List<B>> set = input.stream().map((a) -> a.getIds()).collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

但制作扁平的B组

Bye*_*Bye 9

你必须使用 flatMap

input.stream()
    .map(a -> a.getIds())
    .flatMap(ids -> ids.stream())
    .collect(Collectors.toSet());
Run Code Online (Sandbox Code Playgroud)

这将产生平面套装.

  • 您还可以使用方法引用:`.map(A :: getIds).flatMap(List :: stream)` (2认同)