Java лямбда не компилируется - PullRequest
1 голос
/ 24 апреля 2020

Может кто-нибудь сказать, почему 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 непосредственно в лямбду, и она скомпилируется.
Сокращение должно быть принято BinaryOperator

Ответы [ 2 ]

1 голос
/ 24 апреля 2020

doReduce() равно a BinaryOperator.

doReduce2() возвращает a BinaryOperator.

, поскольку reduce() ожидает BinaryOperator, вы можете указать doReduce в качестве ссылки на метод , или вы можете вызвать doReduce2().

1 голос
/ 24 апреля 2020

Вы должны попытаться вызвать метод doReduce2 без использования ссылки на метод, и он должен работать -

Map<Integer, ObjStr2> result2 = strings.stream()
        .map(ObjStr1::new)
        .collect(Collectors.groupingBy(ObjStr1::getLen,
                Collectors.reducing(new ObjStr2(),
                        ObjStr1::to2, ObjStr2.doReduce2())));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...