gpt4 book ai didi

java - 使用 lambda 表达式求和成员变量?

转载 作者:搜寻专家 更新时间:2023-10-31 08:32:06 25 4
gpt4 key购买 nike

我有一个类如下。

public class Votes{
String name;
int likes;
int dislikes;

//constructors, getters and setters
}

我有如下列表。

List<Votes> votesList;

假设我用一些元素填充上面的列表。我想声明一个在该列表中执行分组和求和操作的方法。

例如,假设我在列表中给出以下元素作为 input对于那个方法。

votesList.add(new Votes("A", 10, 5));
votesList.add(new Votes("B", 15, 10));
votesList.add(new Votes("A", 20, 15));
votesList.add(new Votes("B", 10, 25));
votesList.add(new Votes("C", 10, 20));
votesList.add(new Votes("C", 0, 15));

该方法应该输出 List<Votes>具有以下元素。

("A", 30, 20),
("B", 25, 35),
("C", 10, 35)

在 Java8 中有使用流、lambda 表达式的简单方法吗?我知道如何使用 collectors 来完成如果我只有一个int成员(member)。

谁能解释一下我该如何解决这种情况?

最佳答案

一种方法是使用 groupingBy , 结合 reducing :

Collection<Optional<Votes>> res =
votesList.stream().collect(groupingBy(v -> v.name, reducing((v1, v2) -> new Votes(v1.name, v1.likes + v2.likes, v1.dislikes + v2.dislikes)))).values();

这会给你一个 Collection<Optional<Votes>> , 你可以通过组合 reducing 来摆脱它收集器和整理器功能Optional::get使用 collectingAndThen收集器,但这将开始看起来很难阅读。

所以另一种选择是使用 toMap , 并合并两个具有相同名称的投票:

Collection<Votes> res =
votesList.stream().collect(toMap(v -> v.name,
v -> v,
(v1, v2) -> new Votes(v1.name, v1.likes + v2.likes, v1.dislikes + v2.dislikes))).values();

从那里您可以使用 ArrayList复制构造函数(通过将 collectingAndThenm -> new ArrayList<>(m.values()) 一起使用,或者将前一个表达式放入此复制构造函数的参数列表中)。

关于java - 使用 lambda 表达式求和成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40001878/

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