gpt4 book ai didi

java - Java 可以在调用链中分组、排序和置顶吗?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:08:56 24 4
gpt4 key购买 nike

我有一个 POJO 类

class A {
public int id;
public String groupName;
public String getGroupName() { return this.groupName; }

public int value;

public A(int id, String groupName, int value) {
this.id = id;
this.groupName = groupName;
this.value = value;
}
}

而且 id 是唯一的,但是 groupName 不是。然后我有一个 A 列表。

List<A> list = new ArrayList<A>();
list.add(new A(1, "A", 3));
list.add(new A(2, "B", 5));
list.add(new A(3, "B", 7));
list.add(new A(4, "C", 7));

我想按组名和值过滤列表,返回每个组名的最大值。

List<B> filtedList = list....
//filtedList contain
//A(1, 'A', 3) A(3, 'B', 7) A(4, 'C', 7)

我知道我可以这样写代码

Map<String, List<A>> map =  list.stream().collect(
Collectors.groupingBy(A::getGroupName)
);

List<A> result = new ArrayList<A>();
map.forEach(
(s, a) -> {
result.addAll(
deliveryOrderItems.stream().sorted(
(o1, o2) -> o2.value.compareTo(o1.value)
).limit(1).collect(Collectors.toList())
);
}
);

问题是,我可以删除中间的 Map 并在一个链调用中执行那些操作吗

//list.stream().groupBy(A::getGroupName).orderInGroup(A::value).topInGroup(1)

最佳答案

你可以做的是使用 groupingBy与下游收集器。

在你的情况下 maxBy会为你完成这项工作。这会给你一个 Map<String, Optional<A>>根据您提供的比较器,每个键都映射到一个可选的最大值。

然后你得到映射的值,过滤它们,这样你就只得到非空的可选值(在 get() 上调用 Optional 时避免 NSEE)。您最终将收集到的内容提取到 List 中.

import static java.util.Comparator.comparingInt;
import static java.util.stream.Collectors.groupingBy;
import static java.util.stream.Collectors.maxBy;
import static java.util.stream.Collectors.toList;

...

List<A> resultList =
list.stream()
.collect(groupingBy(A::getGroupName,
maxBy(comparingInt(A::getValue))))
.values()
.stream()
.filter(Optional::isPresent)
.map(Optional::get)
.collect(toList());

给定你的例子,它输出:

[A(1, A, 3), A(3, B, 7), A(4, C, 7)]

关于java - Java 可以在调用链中分组、排序和置顶吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31604284/

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