使用Generator在java中生成元组

时间:2015-02-07 16:13:15

标签: java lambda java-8 java-stream

我试图抓住新的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<Tuple>
Supplier<Tuple> anyTuple = s -> TupleFactory.next();
Stream<Tuple> result = Stream.generate(anyTuple);

我得到了:

  

Lambda表达式的签名与功能接口方法get()

的签名不匹配

在我定义供应商的行中......

任何线索?

2 个答案:

答案 0 :(得分:2)

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

然后,试试这个:

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

如果您不想修复static,那么这应该有效:

Supplier<Tuple> anyTuple = TupleFactory::next;

答案 1 :(得分:0)

你的lambda必须为

提供身体
T get();
Supplier<T>接口中的

方法并处理所有这些方法参数。但在这种情况下,get方法没有任何参数,因此s中不需要s -> ...。而不是

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

使用

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

或者更简单的使用method references

Supplier<Tuple> anyTuple = TupleFactory::next;