通过转换减少Java Lambda组 [英] Java Lambda groupby reducing with transformation
问题描述
有人可以告诉我为什么这些lambda不会产生相似的结果吗?
Can someone tell me why these to lambdas don't produce similar results?
public class Test {
public static void main(String args[]){
List<String> strings = List.of("a", "bb", "cc", "ddd");
Map<Integer, List<Character>> result1 = strings.stream()
.map(toStringList())
.collect(Collectors.groupingBy(List::size
, Collectors.reducing(List.of(),concat())
));
System.out.println(result1);
Map<Integer,ObjStr2> result2 = strings.stream()
.map(ObjStr1::new)
.collect(Collectors.groupingBy(ObjStr1::getLen
, Collectors.reducing(new ObjStr2(), ObjStr1::to2, ObjStr2::doReduce)));
System.out.println(result2);
}
private static Function<String, List<Character>> toStringList(){
return s-> s.chars()
.mapToObj(c->(char) c)
.collect(Collectors.toList());
}
private static BinaryOperator<List<Character>> concat(){
return (l1, l2) -> {
return Stream.concat(l1.stream(), l2.stream()).collect(Collectors.toList());
};
}
}
class ObjStr1{
String str = "";
ObjStr1(String str) {
this.str = str;
}
static ObjStr2 to2(ObjStr1 o){
return new ObjStr2(o.str);
}
Integer getLen(){return str.length(); };
}
class ObjStr2{
String str = "";
ObjStr2(){}
ObjStr2(String str) {
this.str = str;
}
static ObjStr2 doReduce(ObjStr2 a, ObjStr2 b){
a.str += b.str;
return a;
}
@Override
public String toString(){
return str;
}
}
结果:
{1 = [a],2 = [b,b,c,c],3 = [d,d,d]}
{1 = abbccddd,2 = abbccddd,3 = abbccddd}
Results:
{1=[a], 2=[b, b, c, c], 3=[d, d, d]}
{1=abbccddd, 2=abbccddd, 3=abbccddd}
预期:
{1 = a,2 = bbcc,3 = ddd}
Expected:
{1=a, 2=bbcc, 3=ddd}
您的帖子似乎主要是代码;请添加更多详细信息.看起来您的帖子大部分是代码;请添加更多详细信息.看起来您的帖子大部分是代码;请添加更多详细信息.
It looks like your post is mostly code; please add some more details. It looks like your post is mostly code; please add some more details. It looks like your post is mostly code; please add some more details.
推荐答案
我认为问题是第二个收集器中的 new ObjStr2()
.您对所有组使用相同的起始元素.
I think the problem is the new ObjStr2()
in your second collector. You're using the same starting element for all groups.
您要将所有内容连接到同一对象,并且由于这是可变的,因此所有内容都将附加到同一对象.
You're concatenating everything to the same object, and because this is mutable, everything is appended to that same object.
相反,让您的 doReduce
返回一个新对象:
Instead, make your doReduce
return a new object:
static ObjStr2 doReduce(ObjStr2 a, ObjStr2 b) {
return new ObjStr2(a.str + b.str);
}
输出:
{1=[a], 2=[b, b, c, c], 3=[d, d, d]}
{1=abbccddd, 2=abbccddd, 3=abbccddd}
(但是,如果要执行此操作,则不妨直接使用 String
).
(But if you're going to do that, you may as well just use String
directly).
这篇关于通过转换减少Java Lambda组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!