通过转换减少Java Lambda组 [英] Java Lambda groupby reducing with transformation

查看:50
本文介绍了通过转换减少Java Lambda组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人可以告诉我为什么这些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);
}

Ideone演示

输出:

{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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆