Java 编写增量整数供应商

Java 编写增量整数供应商,java,functional-programming,Java,Functional Programming,我试图掌握一些Java8函数式编程。我试图“从功能上”编写以下IntSupplier,但一直遇到问题 import java.util.function.IntSupplier; @Test public void test_nonFunctional() { IntSupplier supplier = new IntSupplier() { private int nextInt = 0; @Override publ

我试图掌握一些Java8函数式编程。我试图“从功能上”编写以下
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.
    }
}

如果答案很简单,不使用额外的对象就无法完成,请直说。

您对问题的定义已经不起作用了。在functional中,没有参数就不能有不同的输出。这就是定义。但是如何创建java库中的数字序列:
java.util.function.IntUnaryOperator
。它是这样使用的:

IntStream.iterate(0, i -> i+1).limit(10).foreach(System.out::printLn);
IntSupplier supplier = new AtomicInteger(0)::incrementAndGet;

有一种解决此问题的标准方法:

int[] nextInt = { 0 }; // optionally mark as final
IntSupplier supplier = () -> nextInt[0]++;

但它实际上并不比“有效但不实用”解决方案更实用。

您可以这样做:

IntStream.iterate(0, i -> i+1).limit(10).foreach(System.out::printLn);
IntSupplier supplier = new AtomicInteger(0)::incrementAndGet;

@Mena不会随时间增加…感谢您指向
IntStream::iterate
并提醒定义(我已经忘记了,真遗憾)。然而,由于您提醒了这个定义,我必须补充一点,Java8不是一种合适的函数式编程语言,它只是使用函数式编程风格来简化代码的某些部分。。。您的代码打印一个
0
的列表,将其更改为
i->i+1
使其工作。