gpt4 book ai didi

java - 如何使用 Java 8 Stream 扩展和重组列表列表?

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:16:46 33 4
gpt4 key购买 nike

我有一个 A 类列表,其中包括一个列表本身。

public class A {
public double val;
public String id;
public List<String> names = new ArrayList<String>();
public A(double v, String ID, String name)
{
val = v;
id = ID;
names.add(name);
}

static public List<A> createAnExample()
{
List<A> items = new ArrayList<A>();

items.add(new A(8.0,"x1","y11"));
items.add(new A(12.0, "x2", "y21"));
items.add(new A(24.0,"x3","y31"));
items.get(0).names.add("y12");
items.get(1).names.add("y11");
items.get(1).names.add("y31");
items.get(2).names.add("y11");
items.get(2).names.add("y32");
items.get(2).names.add("y33");
return items;
}

目的是对列表中每个 id 的平均 val 求和。我使用一些 Java 8 流在 Main 函数中添加了代码。我的问题是如何在不使用第二个数组和 for 循环的情况下以更优雅的方式重写它。

static public void main(String[] args) {
List<A> items = createAnExample();

List<A> items2 = new ArrayList<A>();
for (int i = 0; i < items.size(); i++) {
List<String> names = items.get(i).names;
double v = items.get(i).val / names.size();
String itemid = items.get(i).id;
for (String n : names) {
A item = new A(v, itemid, n);
items2.add(item);
}
}
Map<String, Double> x = items2.stream().collect(Collectors.groupingBy(item ->
item.names.isEmpty() ? "NULL" : item.names.get(0), Collectors.summingDouble(item -> item.val)));
for (Map.Entry entry : x.entrySet())
System.out.println(entry.getKey() + " --> " + entry.getValue());
}

最佳答案

你可以用 flatMap 来实现:

x = items.stream()
.flatMap(a -> a.names.stream()
.map(n -> new AbstractMap.SimpleEntry<>(n, a.val / a.names.size()))
).collect(groupingBy(
Map.Entry::getKey, summingDouble(Map.Entry::getValue)
));

如果您发现自己经常处理此类问题,请考虑使用静态方法来创建 Map.Entry:

static<K,V> Map.Entry<K,V> entry(K k, V v) {
return new AbstractMap.SimpleImmutableEntry<>(k,v);
}

然后你会有一个不那么冗长的 .map(n -> entry(n, a.val/a.names.size()))

关于java - 如何使用 Java 8 Stream 扩展和重组列表列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32321571/

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