2015-02-07 2 views
1

새로운 java8 스트림에 대한 연구를하고 있습니다.자바에서 튜플을 생성하기위한 생성기를 사용하십시오.

I는 특정 특성 튜플 무한 스트림을 생성해야

튜플 세 inta, bc있을 것이다.

: 다음

a가 나는 TupleFactory을 만들어 계산하는 필터를 사용하는 것이

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

:

bc 단지와 for 루프에서 만들 수있는 카운터입니다

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>을 생성하고 싶습니다. 로 :

람다 식의 서명이 내가 공급자를 정의하는 선에서 기능 인터페이스 방법 get()

의 서명과 일치하지 않습니다 ... :

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

내가 얻을

실마리가 있습니까?

답변

2

먼저 TupleFactory에서 static의 모든 인스턴스를 제거하십시오. static의 사용은 난센스입니다.

다음

,이 시도 : 당신이 당신의 static의 문제를 해결하지 않으려면

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

는,이 작동합니다 :

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

의, 하나의 기반 인덱스를 사용하는 아주 나쁜 매너로 간주된다는 점에 유의하시기 바랍니다. 좋은 신사는 항상 0부터 시작하는 색인을 사용합니다. –

+0

고마워, 나도 알아,하지만 문제는 명시 적으로 조건을 만족하지만 모든 제로 솔루션을 금지합니다. –

+1

도움이 될 수있어서 기쁩니다! –

0

귀하의 람다

T get(); 
을 위해 몸을 제공해야

메서드를 사용하고이 모든 메소드 인수를 처리하십시오. 그러나이 경우 get 메서드에는 인수가 없으므로 ss -> ...에 둘 필요가 없습니다. 대신

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

사용

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

또는 어쩌면 간단하게 사용 또한 method references

Supplier<Tuple> anyTuple = TupleFactory::next; 
관련 문제