【问题标题】:use Generator for generating Tuples in javajava中使用Generator生成元组
【发布时间】:2015-04-07 16:36:43
【问题描述】:

我正在尝试掌握新的 java8 流。

我需要生成具有某些特征的无限元组流:

元组将具有三个 int 值,abc

其中bc 只是计数器,可以在for 循环中使用:

for (int c = 1;; c++) {
    for (int b = 1; b < c; b++) {
        ...
    }
}

然后我会使用过滤器来计算a

我创建了一个TupleFactory

class TupleFactory {
    private static int b = 1;
    private static int c = 1;

    public static Tuple next(){
        if (b >= c - 1)
            c++;
        else
            b++;
        return new MyTuple (1,b,c);
    }
}

然后我想生成Stream&lt;Tuple&gt;

Supplier<Tuple> anyTuple = s -> TupleFactory.next();
Stream<Tuple> result = Stream.generate(anyTuple);

我得到一个:

Lambda 表达式的签名与函数式接口方​​法get()的签名不匹配

在我定义供应商的那一行...

有什么线索吗?

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    首先,删除 TupleFactory 中的每个 static 实例。 static 的使用是无稽之谈。

    然后,试试这个:

    TupleFactory myFactory = new TupleFactory();
    Supplier<Tuple> anyTuple = myFactory::next;
    

    如果您不想修复您的statics,那么这应该可以:

    Supplier<Tuple> anyTuple = TupleFactory::next;
    

    【讨论】:

    • 另外,请记住,使用基于 1 的索引被认为是非常不礼貌的行为。好先生总是使用从零开始的索引。
    • 谢谢,我知道,但该问题明确禁止一切为零的解决方案,尽管它满足条件。
    【解决方案2】:

    您的 lambda 必须为

    提供正文
    T get();
    

    Supplier&lt;T&gt; 接口中的方法并处理所有这些方法参数。但在这种情况下,get 方法没有任何参数,因此在s -&gt; ... 中不需要s。而不是

    Supplier<Tuple> anyTuple = s -> TupleFactory.next();
    

    使用

    Supplier<Tuple> anyTuple = () -> TupleFactory.next();
    //                         ^^ - means no arguments
    

    或者更简单的使用method references

    Supplier<Tuple> anyTuple = TupleFactory::next;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-23
      • 2021-07-29
      • 2019-09-13
      相关资源
      最近更新 更多