您不能将方法引用用于需要接收自由变量的构造函数,即来自上下文的变量.
您可以使用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表达式中使用它没有任何意义.