2015-01-12 2 views
3

저는 Java 8 함수 프로그래밍에 대해 몇 가지 이해하려고합니다. 나는 "functionalally"다음의 IntSupplier을 쓰려고했지만, 계속 문제가있다.증분 형 정수 공급자 작성하기

import java.util.function.IntSupplier; 

    @Test public void test_nonFunctional() { 
     IntSupplier supplier = new IntSupplier() { 
      private int nextInt = 0; 
      @Override public int getAsInt() { 
       return nextInt++; 
      } 
     }; 
    } 

내 시도입니다. 문제는 코드에서 주석으로 표시됩니다.

import org.junit.Test; 

import java.util.concurrent.atomic.AtomicInteger; 
import java.util.function.IntSupplier; 

public class IntSupplierTest { 
    @Test public void test_nonFunctional() { 
     IntSupplier supplier = new IntSupplier() { 
      private int nextInt = 0; 
      @Override public int getAsInt() { return nextInt++; } 
     }; // Works but is not functional. 
    } 

    @Test public void test_naive() { 
     int nextInt = 0; 
     IntSupplier supplier =() -> nextInt++; // Doesn't compile: requires nextInt to be final. 
    } 

    @Test public void test_nextIntIsFinal() { 
     final int nextInt = 0; 
     IntSupplier supplier =() -> nextInt++; // Doesn't compile: nextInt can't be incremented because it's final. 
    } 

    @Test public void test_useWrapper() { 
     final AtomicInteger nextInt = new AtomicInteger(0); 
     IntSupplier supplier =() -> nextInt.getAndIncrement(); // It is not the same as my original question as this test uses an extra object. 
    } 
} 

답변이 단순히 추가 물체를 사용하지 않고는 불가능하다는 이유만으로 말하십시오.

+0

는 –

답변

2

문제 정의가 이미 작동하지 않습니다. 기능적으로는 인수없이 다른 결과를 낼 수 없습니다. 그것이 정의입니다. 하지만 자바 라이브러리에서 볼 수있는 일련의 숫자를 만드는 방법 : java.util.function.IntUnaryOperator. 그것은 다음과 같이 사용되는 : 그 @Mena

IntStream.iterate(0, i -> i+1).limit(10).foreach(System.out::printLn); 
+0

향해 가리키는 주셔서 감사합니다 ... 시간이 지남에 따라 증가하지 않는'IntStream :: iterate'와 (나 내가 잊고 있었던, 수치)의 정의를 생각 나게. 그러나 그 정의를 생각 나게하기 때문에 자바 8은 적절한 함수형 프로그래밍 언어가 아니며 기능적 프로그래밍 스타일을 사용하여 코드의 일부분을 단순화한다고 덧붙여 야합니다. –

+0

oops ... 당신의 코드는'0'의 목록을 출력하고'i -> i + 1'로 바꾸면 작동합니다. –

관련 문제