当前位置: 首页 > 知识库问答 >
问题:

Java流:在列表中聚合map()中接收的所有非空集合

蔚承天
2023-03-14

我有包含字符串ID的集合idList。函数getCollection返回单个ID项的集合(类型为MyType)。此外,它可能返回null。

所以对于idList中的许多id,我会得到一些null和一些集合。

目标是收集getCollection对一组ID的所有回复到最终列表中。

我想象过

 List<MyType> reply = idList.stream().map(id -> getCollection(id))
       .filter(p -> p != null).collect(Collectors.toList());

但它似乎不是一个有效的表达式。如何使它有效?

另外,这个实现的性能如何?

共有1个答案

田阳泽
2023-03-14

你需要使用平面地图-

List<MyType> reply = idList.stream()
    .map(id -> getCollection(id))
    .filter(collection -> collection != null)
    .flatMap(Collection::stream)
    .collect(Collectors.toList());

如果您正在考虑mapflatMap操作之间的差异,那么您可以参考这个极好的答案-

map和flatMap都可以应用于流,它们都返回流。不同之处在于,map操作为每个输入值生成一个输出值,而flatMap操作为每个输入值生成任意数量(零或更多)的值。

这反映在每个操作的参数中。

map操作采用一个函数,对输入流中的每个值调用该函数,并生成一个结果值,该结果值被发送到输出流。

平面图操作接受一个概念上想要消耗一个值并产生任意数量的值的函数。然而,在Java,对于一个方法来说,返回任意数量的值是很麻烦的,因为方法只能返回零个或一个值。人们可以想象一个应用编程接口,其中平面图的映射器函数接受一个值并返回一个数组或一个值列表,然后将其发送到输出。鉴于这是流库,表示任意数量的返回值的一个特别合适的方法是映射器函数本身返回一个流!映射器返回的流中的值从流中抽干并传递给输出流,每次调用映射器函数返回的值的“团块”在输出流中根本没有区分,因此输出被称为“扁平化”。

flatMap的mapper函数通常用于返回流。empty(),如果它想发送零值或类似于流的内容。如果要返回多个值,则返回(a,b,c)。但当然,任何流都可以返回。

 类似资料:
  • 我有一个嵌套的映射,其中key是员工名称,values是另一个映射,其中key是公司名称,value是经验年数,如下所示 现在我的函数应该返回一个映射,以员工姓名为键,以总经验为值。我如何使用java流(在单个流中)做到这一点

  • 我想迭代一个对象列表。每个对象都包含一些对象的变量。更具体地说: 我的名单是: 所需的映射结构是:

  • 我使用的是java 11,我有一个名为MyObject的对象列表,看起来像这样 我想使用流将这些对象收集到地图中 我试着用收集器来做。toMap(),但似乎不可能做到这一点 我的问题是可以制作一张地图吗

  • 我们在Java中有任何聚合器函数来执行下面的聚合吗?

  • 我有一个列表的地图,并希望收集所有的值,然后流在收集的列表上,所以给出:- 下面的工作/显示了我想用迭代做什么,但我想在流中做这些,而不是使用迭代创建一个中间列表:- 因此,我希望将列表的映射流化到一个列表中,然后在一个流中处理该子列表,而不是必须在两个语句中完成上述操作(即通过迭代构建列表,然后进行流化以筛选/排序和收集)。 到目前为止,我还没有做到这一点,当我尝试流式/收集地图时,我会遇到编译

  • 我不知道如何解决这个问题。 请帮帮我.