java8 new_java-8 – 如何在Java8中初始化thru :: new时将参数传递给类构造函数

您不能将方法引用用于需要接收自由变量的构造函数,即来自上下文的变量.

您可以使用lambda表达式:

Mapper mapper = new Mapper();

List actions =

names.stream()

.map(name -> new Store(name, mapper))

.collect(Collectors.toList());

无论出于何种原因,如果你坚持使用方法参考,你仍然可以,尽管解决方案更复杂和繁琐.实际上,从所有可能的观点来看,使用lambda表达式而不是我在下面介绍的hack会更好.我写它只是为了表明方法引用只有在你已经拥有一个签名与预期签名匹配的方法或构造函数时才有用.

假设您声明了这个辅助方法:

public static Function bindSecond(

BiFunction biFunction,

U free) {

return t -> biFunction.apply(t, free);

}

在这里,我正在创建并返回一个1参数函数,该函数将其唯一的一个参数应用于给定的双函数(一个2参数函数),以及给定的自由变量.换句话说,我将给定的自由变量绑定到给定的双函数作为其第二个参数.

在你的例子中,Store :: new实际上是一个双功能,它接受两个参数(name和mapper)并返回一个值(新的Store实例),并且你得到了编译错误,因为Stream.map需要一个1参数函数将流的元素作为其唯一的参数.

bindSecond辅助方法实际上将给定的双函数和自由变量转换为与Stream.map方法的签名匹配的单参数函数.

您可以按如下方式使用它:

Mapper mapper = new Mapper();

List actions =

names.stream()

.map(bindSecond(Store::new, mapper))

.collect(Collectors.toList());

但同样,我认为在一个简单的lambda表达式中使用它没有任何意义.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值