我试图抓住新的java8流。
我需要生成具有某些特征的无限元组流:
元组将有三个int
个值,a
,b
和c
。
其中b
和c
只是计数器,可以在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()
在我定义供应商的行中......
任何线索?
答案 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;