首页 > 解决方案 > Java Lambda 未编译

问题描述

有人能说出为什么 doReduce 编译但 doReduce2 没有:

List<String> strings = List.of("a", "bb", "cc", "ddd");
Map<Integer,ObjStr2> result2 = strings.stream()
                .map(ObjStr1::new)
                .collect(Collectors.groupingBy(ObjStr1::getLen
                        , Collectors.reducing(new ObjStr2(), ObjStr1::to2, ObjStr2::doReduce)));

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 BinaryOperator<ObjStr2> doReduce2(){
        return (a,b) -> new ObjStr2(a.str + b.str);
    }

    static ObjStr2 doReduce(ObjStr2 a, ObjStr2 b){
        return new ObjStr2(a.str + b.str);
    }

    @Override
    public String toString(){
        return str;
    }
}

我什至可以将 doReduce2 的内容直接复制到 lambda 中,它会编译。
减少应该接受 BinaryOperator

标签: javalambda

解决方案


您应该尝试在doReduce2不使用方法引用的情况下调用该方法,它应该可以工作 -

Map<Integer, ObjStr2> result2 = strings.stream()
        .map(ObjStr1::new)
        .collect(Collectors.groupingBy(ObjStr1::getLen,
                Collectors.reducing(new ObjStr2(),
                        ObjStr1::to2, ObjStr2.doReduce2())));

推荐阅读