java - 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
解决方案
您应该尝试在doReduce2
不使用方法引用的情况下调用该方法,它应该可以工作 -
Map<Integer, ObjStr2> result2 = strings.stream()
.map(ObjStr1::new)
.collect(Collectors.groupingBy(ObjStr1::getLen,
Collectors.reducing(new ObjStr2(),
ObjStr1::to2, ObjStr2.doReduce2())));
推荐阅读
- javascript - 如何在不删除 map 方法的情况下对此代码实现过滤器方法?
- python - 如何为解码器使用上一个时间步的基本事实答案
- html - 通过在图像标签中传递链接生成 QR 码扫描仪
- react-native - React Native - 如何重新分配本地化变量以将语言正确翻译为 es-US?
- r - 为什么survival :: tmerge突然给出错误“既没有找到tstop参数也没有找到初始事件参数”?
- ios - 由于具有不同私钥的重复分发证书,无法对 iOS 应用程序进行代码签名
- angular - 使用 Ionic/Cordova 从 Angular 10 发布时的标题
- multithreading - 用于检查 IPOPT 中 HSL 求解器 MA97 并行性的示例代码
- python - 如何使用 sns.kdeplot() 从热图中删除白色阴影/颜色?我只想要红色
- typescript - TypeScript: pass rejected promise as a parameter