【问题标题】:Java 8 collections streaming - Convert list to Set, transforming result [duplicate]Java 8 集合流 - 将列表转换为集合,转换结果 [重复]
【发布时间】:2017-06-12 12:48:31
【问题描述】:

使用以下方法成像对象:

class A { List<B> getIds(){...} }

现在我有一个集合 A 作为输入; 我想从中获取一组唯一的 ID,通常你会选择:

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

有没有办法使用流 API 在一行中做同样的事情,如下所示

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

但是制作扁平的B组

【问题讨论】:

  • 为什么问题被标记为重复?我知道问题和答案非常相似,但是 Set 和 List 不是一回事。

标签: java collections java-stream


【解决方案1】:

你必须使用flatMap

input.stream()
    .map(a -> a.getIds())
    .flatMap(ids -> ids.stream())
    .collect(Collectors.toSet());

这将产生平面集。

【讨论】:

  • 也可以使用方法参考:.map(A::getIds).flatMap(List::stream)
  • 只需一步.flatMap(a -&gt; a.getIds().stream())...
  • 最好使用四个map,然后使用一个mapmap(a -&gt; a.b().c().d().e())
猜你喜欢
  • 2018-02-28
  • 1970-01-01
  • 2011-01-29
  • 2017-02-27
  • 2013-12-16
  • 2018-10-08
  • 2010-10-15
  • 2017-08-04
  • 1970-01-01
相关资源
最近更新 更多