gpt4 book ai didi

Java Stream 从对象列表生成映射

转载 作者:行者123 更新时间:2023-12-04 10:22:49 25 4
gpt4 key购买 nike

我有一堂这样的课。

public class Foo {
private String prefix;
private String sector;
private int count;
}

给定一个 foo 列表:
//Args: prefix, sector, count
fooList.add(new Foo("44",,"RowC", 1 ));
fooList.add(new Foo("1",,"Rowa", 1 ));
fooList.add(new Foo("1",,"RowB", 1 ));
fooList.add(new Foo("1",,"Rowa", 1 ));

我需要将请求返回一个对象 按前缀升序排序 像这样:
{
"1": {
"Rowa": "2",
"RowB": "1"
},
"44": {
"RowC": "1"
}
}

所以问题是:
我必须按前缀对列表进行分组,然后显示列表中具有相同行和扇区的每个扇区和项目的计数(*)。
我得到的远是使用这样的流:
fooList.stream()
.collect(Collectors.groupingBy(
Foo::getPrefix,
Collectors.groupingBy(
Foo::getSector,
Collectors.mapping(Foo::getSector , Collectors.counting())
)
));

问题是,上面的代码是计数是一个长整数,我需要作为一个字符串返回。
我试过 .toString 但它给了我一个错误(可以将 java.lang.String 分配给 java.util.stream.Collector)。

更新

在 Andreas 和 Naman 的帮助下,现在我可以将 count 映射为 String。
我只需要按前缀排序。

谁能帮我?

最佳答案

你快到了,只需更换 Collectors.mapping符合:

Collectors.summingInt(Foo::getCount))

如:
List<Foo> fooList = new ArrayList<>();
fooList.add(new Foo("44", "RowC", 1 ));
fooList.add(new Foo("1", "Rowa", 1 ));
fooList.add(new Foo("1", "RowB", 1 ));
fooList.add(new Foo("1", "Rowa", 1 ));

Map<String, Map<String, String>> result = fooList.stream().collect(
Collectors.groupingBy(
Foo::getPrefix,
TreeMap::new, // remove if prefix sorting not needed
Collectors.groupingBy(
Foo::getSector,
() -> new TreeMap<>(Collator.getInstance()), // remove if sector sorting not needed
Collectors.collectingAndThen(
Collectors.summingInt(Foo::getCount),
String::valueOf
)
)
)
);

System.out.println(result); // prints: {1={Rowa=2, RowB=1}, 44={RowC=1}}

请注意 TreeMap构造函数添加到 groupingBy()调用,以确保映射已排序。第一个是按字典顺序排序,而第二个是根据口语排序,即大写与小写不影响顺序。

关于Java Stream 从对象列表生成映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60766605/

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