Может кто-нибудь сказать, почему 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