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

在Java8流中过滤更多次

金高轩
2023-03-14

有可能在流中过滤更多次吗?例如,如果我有一个带有ID的列表,我想流一个HashMap,并将HashMap的键映射到列表中的键,以及它们在哪里匹配,我想从HashMap中获取对象,并再次过滤它,例如该对象中的int字段大于3,并在最后求和。例如,如果它发现10种情况,其中列表的键和HashMap的键相等,它过滤这10种情况,并发现3种情况,例如int字段大于3,它最终返回这些的总和。

到目前为止,这是我的代码:当我试图打印结果列表时,我得到了这个:java.util.stream.参考管道$2@70177ecd

somemap.entrySet().stream().filter(e -> aListContainingIds.contains(e.getKey()))
            .map(Map.Entry::getValue)
            .map(n -> n.getTheOtherListFromMatchedValue().stream().filter(n -> n.getAnIntFieldFromObject() > 3))
            .collect(Collectors.toList());

共有1个答案

孟昊空
2023-03-14

我认为你应该使用流。flatMaptoInt(或Stream.flatMaptoLong)而不仅仅是地图

int total = somemap.entrySet().stream()
    .filter(e -> aListContainingIds.contains(e.getKey()))
    .map(Map.Entry::getValue)
    .flatMapToInt(value -> value.getTheOtherListFromMatchedValue().stream()) 
    .filter(n -> n.getAnIntFieldFromObject() > 3)
    .sum();

一般来说,当您正在应用的函数返回另一个流,并且您希望该流的元素成为原始流的一部分时,将使用平地图(如果流元素是某些类的实例而不是原语,则使用平地图)。

最后,您可以使用IntStream.sum方法获得总数。

 类似资料:
  • 有时您希望筛选具有多个条件的: 也可以使用复杂条件和单个: 第一种方法在可读性方面胜出,但在性能方面,什么更好呢?

  • 假设我有一张房间清单 每个房间都有一份人员名单。 使用java8 streams,我想迭代房间列表,获取所有人员,在每个节点上执行一些方法(doSomething()),并获取所有过滤对象的列表。 这是使用java 8的最佳实践吗?

  • 如何使用java8流和过滤器过滤嵌套循环? 假设我有一个汽车列表(

  • 我正在用Java8为一个文件编写一个解析器。使用读取该文件,并返回一个顺序的。 每一行都映射到一个数据对象,如下所示: 现在我们可以将流中的每一行映射到相应的结果: 但是,流现在包含要删除的值: 如我在中所知,如果需要结果,我如何组合映射/筛选操作?

  • 如何过滤<代码>地图 仅当列表中的任何员工具有字段值性别=“M”时,我才必须过滤。 输入:

  • 我试图创建一个函数,该函数接受多个谓词条件,并根据这些条件过滤流。我找不到任何东西,但我的retList似乎只是由输入组成,而不是输入的过滤版本。 以下是给我的指示: //要生成一个整数流,并将其设置为每个谓词p的输入,请将此流变量设置为对流应用过滤器(p)的结果。完成for-each循环后,像我们在前面的问题中所做的那样,将结果流收集到一个列表中,返回结果列表 这是我目前拥有的: 这就是它的测试