Java lambda参数:如何防止使用外部作用域的参数?

时间:2019-07-16 10:07:06

标签: java lambda closures

我确实知道lambda和参数如何在Java中工作。 问题在于,在lambda主体中,我被强制执行以仅使用lambda参数,并且(如果可能)让编译器在使用外部范围变量时抛出错误。

示例:

坏:

    int outerInt = 3;
    Predicate<String> lamb = s -> { 
        return outerInt==0 && s.equals("x"); //using outerInt -> bad!
    };

    bool res = lamb.test("?");

好:

    int outerInt = 3;
    BiPredicate<String, Integer> lamb = (s, i) -> { 
        return i==0 && s.equals("x"); //using lambda parameter 'i' instead of outerInt-> good!
    };

    bool res = lamb.test("?", outerInt);

您将如何设计代码,或者我们可以通过某种方式设置Java编译器以实施此方法?

1 个答案:

答案 0 :(得分:3)

您想要的东西实际上与lambda的性质背道而驰:

  

lambda表达式的主体与嵌套块的作用域相同。

Source.

如果要分离作用域,请将功能放入不同的方法中。