java - 泛型和流 : How to make this into a `StreamTuple::new` statement?

标签 java generics

我正在开发一个模拟 Streams 中的多值返回值的小型库。为了让它运作良好,我希望能够使用 StreamTuple::new而不是 StreamTuple::createid -> 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/

相关文章:

java - 如何在不使用 Stream API、MAP、Hashset、collection API 的情况下,统计已排序的 ArrayList 中每个字符串出现的频率

java - 无法使用 NSInputStream 在 iOS 客户端中读取来自 Java 服务器的响应

c# - C# 中不允许接口(interface)<动态> - 解决方法

java - 如何处理一个流畅的界面,其中每个步骤都可以是终端操作?

使用参数化类的 Java 泛型问题

java - 如何检查公钥是否与私钥匹配?

java - 选择图像时的 NPE

java - 在使用 Jackson 反序列化期间有选择地忽略 JSON 属性

java - 在 Java 中使用泛型

c# - 处理泛型