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

Java 8集合流-将列表转换为集合,转换结果,java,collections,java-stream,Java,Collections,Java Stream,使用以下方法对对象进行成像: class A { List<B> getIds(){...} } class A{List getIds(){…} 现在我有一个集合作为输入; 我想从中获得一组独特的ID,通常您会选择: Set<B> ids = new HashSet<>(); for(A a : input){ ids.addAll(a.getIds()); } Set id=new HashSet(); 对于(A:输入){ addAll(a.ge

使用以下方法对对象进行成像:

class A { List<B> getIds(){...} }
class A{List getIds(){…}
现在我有一个集合作为输入; 我想从中获得一组独特的ID,通常您会选择:

Set<B> ids = new HashSet<>();
for(A a : input){
  ids.addAll(a.getIds());
}
Set id=new HashSet();
对于(A:输入){
addAll(a.getIds());
}
有没有一种方法可以使用流API在一行中实现同样的功能,如下面所示

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

但是制作B的平面集必须使用
flatMap

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

这将生成平面集。

您还可以使用方法引用:
.map(A::getIds).flatMap(List::stream)
只需一步
.flatMap(A->A.getIds().stream())
…最好使用四个
映射
然后使用一个
映射
映射(A->A.b().c().d().e())为什么问题被标记为重复?我知道问题和答案非常相似,但集合和列表不是一回事。