3 回答
TA贡献1803条经验 获得超3个赞
我不确定这是因为我以某种方式混淆了语法,还是因为 map 方法有太多重载而无法创建明确的引用。
你没有弄乱语法;Java 中没有等效项(它通常比 C# 更冗长,流也不例外。)
当您要传递给方法的参数与功能接口中的参数相同且顺序相同时,您只能使用方法引用(双冒号)语法。
在 的情况下map
,只有一个参数,您需要将第二个参数(即Bar.class
)传递给modelMapper.map()
,因此不允许使用方法引用语法。您可以使用它的唯一方法是,如果您要将其子类化modelMapper
以Bar
仅使用它,从而消除对第二个显式类参数的需要。
我非常有信心您在此处使用的方法是 Java 中最简洁的处理方式。
TA贡献1876条经验 获得超5个赞
Java 不支持部分函数应用(与柯里化相关),因此您只能使用 lambda 来做到这一点。
当然,由于您不引用任何局部变量或参数,您可以定义一个方法,然后再引用它。
@AutoWired ModelMapper modelMapper;
private Bar mapToBar(Foo x) {
return modelMapper.map(x, Bar.class);
}
...
List<Bar> results = repository
.getFoos()
.stream()
.map(this::mapToBar)
.collect(Collectors.toList());
这实际上非常接近 lambda 的编译方式,除了mapToBarlambda 是一个隐藏的(合成的)方法。
TA贡献1785条经验 获得超4个赞
实际上这是做不到的,因为你的modelMapper.map()
方法需要两个参数。如果此时你真的想使用方法引用,你可以在你的 中创建一个新方法modelMapper
,它只需要一个参数或将调用包装modelMapper.map()
在另一个方法中,如下所示:
private Bar mapFooToBar(Foo x) { return modelMapper.map(x, Bar.class); }
您现在可以将此方法与方法参考一起使用:
List<Bar> results = repository.getFoos().stream() .map(this::mapFooToBar) .collect(Collectors.toList());
但最后我认为这不会使您的代码以任何方式变得更好,所以我建议使用您已有的 lambda 表达式。
添加回答
举报