2015-02-07 3 views
1

Я пытаюсь получить доступ к новым потокам java8.Использование Генератор для генерации кортежей в java

мне нужно, чтобы генерировать бесконечный поток кортежей с определенными характеристиками:

Кортежей будут иметь три 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()

в строке, где я определить поставщика ...

любые подсказки?

ответ

2

Во-первых, избавиться от всех случаев static в вашем TupleFactory. Это использование static - вздор.

Затем, попробуйте следующее:

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

Если вы не хотите, чтобы исправить свои static с, то это должно работать:

Supplier<Tuple> anyTuple = TupleFactory::next; 
+1

Кроме того, имейте в виду, что это считается очень дурным тоном использовать индексы один на основе. Хорошие джентльмены всегда используют нулевые индексы. –

+0

Спасибо, я знаю, но проблема явно запрещает все нулевое решение, которое хотя и удовлетворяет условиям. –

+1

Рад помочь! –

0

Ваш лямбда должен предоставить тело для

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; 
Смежные вопросы