gpt4 book ai didi

java-8 - 在 Java 8 中使用::new 初始化时如何将参数传递给类构造函数

转载 作者:行者123 更新时间:2023-12-04 22:28:28 25 4
gpt4 key购买 nike

我正在使用 java 8 流 API 对 Store 的列表执行操作对象。
Store需要 String论点和 Mapper目的。 Mapper对所有 Store 都是一样的目的。

问:如何通过Mapper初始化时的对象 Store这里 .map(Store::new) ?

public class Store {
public Store(String name, Mapper mapper) {
}
}

public class Mapper {
}

public class Test {
public static void main(String[] args) {
List<String> names = new ArrayList<String>();

Mapper mapper = new Mapper();
// compile time problem at Store::new because it takes 2 arguments
List<Store> actions =
names.stream()
.map(Store::new)
.collect(Collectors.toList());
}
}

最佳答案

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

请引用Java Tutorial, section Method References查找有关方法引用的更多信息。

您可以改用 lambda 表达式:

Mapper mapper = new Mapper();

List<Store> actions =
names.stream()
.map(name -> new Store(name, mapper))
.collect(Collectors.toList());

如果出于某种原因,您坚持使用方法引用,您仍然可以, 虽然解决方案更加复杂和繁琐 .事实上,从所有可能的角度来看,使用 lambda 表达式而不是我在下面介绍的 hack 要好得多。我写它只是为了表明方法引用只有在你已经有一个签名与预期匹配的方法或构造函数时才是好的。

假设你声明了这个辅助方法:
public static <T, U, R> Function<T, R> bindSecond(
BiFunction<T, U, R> biFunction,
U free) {
return t -> biFunction.apply(t, free);
}

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

在您的示例中, Store::new实际上是一个双函数,它接受两个参数( namemapper )并返回一个值(新的 Store 实例),您会收到编译错误,因为 Stream.map需要一个 1-argument 函数,它将流的元素作为其唯一的一个参数。
bindSecond辅助方法实际上将给定的双函数和自由变量转换为与 Stream.map 的签名匹配的单参数函数。方法。

您可以按如下方式使用它:
Mapper mapper = new Mapper();

List<Store> actions =
names.stream()
.map(bindSecond(Store::new, mapper))
.collect(Collectors.toList());

但是, 我认为在简单的 lambda 表达式上使用它没有任何意义 .

关于java-8 - 在 Java 8 中使用::new 初始化时如何将参数传递给类构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44144668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com