强制Java lambda表达式捕获Java中的非final变量

时间:2015-07-14 09:40:26

标签: java lambda final

是否有可能让lambda表达式捕获一个不是最终的变量?

我知道我的代码可以完美地工作,如果它可以捕获它们,目前我必须创建一个新的变量来复制我希望传递给lambda表达式的非final变量。

final SomeClass otherObj;

for(int i = 0; i < 10; i++) {
    int a = i;
    someObject.method(() -> otherObj.process(a, a+1))
}

我想传递&#39; i&#39;而不是必须创建一个新的临时变量。

2 个答案:

答案 0 :(得分:6)

您可以尝试使用java8,

IntStream.range(0, 10).forEach(i ->{
   someObject.method(() -> otherObj.process(i, i+1))
});

答案 1 :(得分:1)

我使用了java.util.concurrent.atomic包。

以下是一个例子:

        AtomicInteger tifCount = new AtomicInteger(0);
        try(DirectoryStream<Path> ds = Files.newDirectoryStream(Paths.get("C:\\ImageStorage")) {
            ds.forEach(path -> {
                if (FileSystems.getDefault().getPathMatcher("glob:**.tif").matches(path)) {
                    tifCount.incrementAndGet();
                }
            });
        }