gpt4 book ai didi

java - 使用 Stream API 的对象的 Sum 属性

转载 作者:搜寻专家 更新时间:2023-10-31 19:54:37 24 4
gpt4 key购买 nike

我目前有以下情况:

我有一个 Report可以包含多个 Query 的对象对象。 Query对象具有属性:Optional<Filter> comparisonFilter , Optional<String> filterChoiceint queryOutput .

并非每个查询都有比较过滤器,所以我首先检查一下。然后,我确保获得针对特定过滤器的查询(这不是这里的问题,因此我不会详细讨论)。每个过滤器都有一些选择,其中选择的数量是可变的。

这是一个输入示例(这些 Query 对象都具有相同的比较过滤器):

Query 1 -- Choice: 'First' -- Output: 10
Query 1 -- Choice: 'First' -- Output: 5
Query 1 -- Choice: 'Second' -- Output: 25
Query 1 -- Choice: 'Third' -- Output: 10

现在,我想对每个唯一选择的查询输出求和。我目前有这段代码:

report
.getQueries()
.stream()
.filter(q -> q.getComparisonFilter().isPresent())
.filter(q -> q.getComparisonFilter().get().equals(view.getFilter().get()))
.forEach(query -> {

//Sum the query outputs per choice

});

我可以通过创建 Map<String, Integer> 来做到这一点,其中键是选择,值是查询输入。但是然后我需要遍历 Map再次使用某些东西的值(value)(这在这里并不重要)。

输出应该是这样的:

Choice: 'First' -- Summed Output: 15
Choice: 'Second' -- Summed Output: 25
Choice: 'Third' -- Summed Output: 10

但我想直接在 forEach 中使用这个“汇总输出”在直播中,但如果这不再可能或不切实际,我可以接受。

我想以“Java 8”的方式来做到这一点,但我似乎无法找到方法。

所以我的问题是:是否可以使用新的 Stream API 缩短此过程?

注意:如果有人对我如何使这个问题更笼统(也许是更好的标题和一些概括)有一些想法,请告诉我!

最佳答案

如果我没看错的话,你确实是在找一个groupingBy然后您必须通过对值的 int 属性求和来对这些值进行分组。

groupingBy会给你一个Map<String, List<Query>>但随后下游收集器(在本例中为 Collectors.summingInt)将对所有 int 求和Query 的值列表中的实例,导致 Map<String, Integer> .

import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.summingInt;
...

Map<String, Integer> map =
report.getQueries()
.stream()
.filter(q -> q.getComparisonFilter().isPresent())
.filter(q -> q.getComparisonFilter().get().equals(view.getFilter().get()))
.collect(groupingBy(q -> q.filterChoice.get(), summingInt(q -> q.queryOutput)));

请注意,您应该检查 filterChoice可选不为空(也许添加另一个 filter 子句?)。你可以看到这个小gist用于说明原理的基本和简化的演示。

还有 Optional类提供了 equals 的合理实现所以过滤器子句看起来像这样:

.filter(q -> q.getComparisonFilter().equals(view.getFilter()))

关于java - 使用 Stream API 的对象的 Sum 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28586186/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com