Java Lambda组通过还原与转换[关闭]。


谁能告诉我为什么这些到lambdas不会产生类似的结果?

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}。

预期:{1=a,2=bbcc,3=ddd}。{1=a, 2=bbcc, 3=ddd}。

看起来你的帖子大部分都是代码,请补充一些细节。

解决方案:

我认为问题出在 new ObjStr2() 在你的第二个收集器中。你为所有的组使用了相同的起始元素。

你把所有的东西都连接到同一个对象上,而且因为这个对象是可变的,所以所有的东西都会附加到同一个对象上。

取而代之的是,让你的 doReduce 返回一个新对象。

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 直接)。)

给TA打赏
共{{data.count}}人
人已打赏
未分类

找不到DC服务器及其磁盘使用情况。

2022-9-8 2:34:17

未分类

Puppeteer--测试页面的不同选择器。

2022-9-8 2:34:19

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索