我正在开发一个模拟 Streams 中的多值返回值的小型库。为了让它运作良好,我希望能够使用 StreamTuple::new
而不是 StreamTuple::create
或 id -> new StreamTuple<>(id, id)
.我尝试了各种修改,但我的 generics-fu 还不够好,无法弄清楚如何更改源代码以允许这样做。
public class StreamTuple<L, R> {
protected final L left;
protected final R right;
public StreamTuple(L left, R right) {
this.left = left;
this.right = right;
}
/**
* Suitable for method::references. Value is set to id.
*/
public static <L> StreamTuple<L, L> create(L left) {
return new StreamTuple<>(left, left);
}
....
调用代码片段:
Map<String, String> m = Stream.of("1", "2", "3")
// .map(StreamTuple::create)
.map(id -> new StreamTuple<>(id, id))
.collect(toMap(StreamTuple::left, StreamTuple::right));
建议?还是做不到?
编辑:我想要一个额外的构造函数,它只接受一个参数并返回一个 StreamTuple,其中 L 和 R 是同一类型。当前的代码并没有反射(reflect)出这一点,因为不久前我无法让它工作,我想我复制了它。我只能找出如何提供 L/R 之一,而使另一个保持打开状态。如何为此编写单参数构造函数?
最佳答案
您是否考虑过扩展 StreamTuple
以定义单参数构造函数?
Map<String, String> m = Stream.of("1", "2", "3")
.map( UnaryStreamTuple<String>::new )
.collect( Collectors.toMap(UnaryStreamTuple::left, UnaryStreamTuple::right) );
public class UnaryStreamTuple<T> extends StreamTuple<T, T> {
public UnaryStreamTuple(T left) {
super(left, left);
}
public UnaryStreamTuple(T left, T right) {
super(left, right);
}
}
关于java - 泛型和流 : How to make this into a `StreamTuple::new` statement?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48775814/