我有一个List
org.apache.commons.lang3.tuple.Pair
s我希望映射它们,以便生成的对象通过方法引用接受对中的两个元素作为其构造函数参数。所以代码语义是这样的:
List<Pair<String, Object>> typeAConstructorArgs = {(a,b),(c,d) ... };
List<A> listOfAs = typeAConstructorArgs.map( A::new ).collect(Collectors.ToList());
据我所知,这是不可能的 - 所以我的问题是,如何避免以传统方式调用构造函数:
List<A> listOfAs = typeAConstructorArgs.map( pair -> new A(pair.getLeft(), pair.getRight() ).collect(Collectors.ToList());
我更普遍地认为这个问题是如何将收集元素替换为方法引用&#39 ;;这可能是Java,原生或其他?我很确定这种做法在Scala等函数式语言中很常见。
答案 0 :(得分:1)
你可以这样想,你接受两个对象的构造函数只不过是BiFunction
,所以它在某种程度上是这样的:
BiFunction<First, Second, A> f = A::new;
但map
接受某种类型的Function
,因此您可以添加另一个接受Pair
作为输入的构造函数,实际上变为:
Function<Pair, A> consF = A::new // assuming there is a constructor that takes a Pair as input
答案 1 :(得分:0)
如果A
的构造函数接受Pair
,这将有效。如果它接受了对中的两个元素,则必须使用它们两个明确地调用它:
List<A> listOfAs =
typeAConstructorArgs.map(p -> new A(p.getLeft(), p.getRight()))
.collect(Collectors.toList());