【问题标题】:Java lambda parameters: how can I prevent using parameters from outer scope?Java lambda 参数:如何防止使用外部范围的参数?
【发布时间】:2019-11-25 01:07:36
【问题描述】:

我确实知道 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 编译器来强制执行这种方法?

【问题讨论】:

  • 您或多或少会问:如何在不实际使用 lambda 的情况下使用 lambda;你需要一些类型的输入。
  • 不,您不能在 Java 中选择性地为自己关闭语言功能。这需要在代码审查中强制执行。也许您可以为此编写一个静态分析器并将其挂接到您的构建中。

标签: java lambda closures


【解决方案1】:

你想要的东西实际上违背了 lambdas 的本质:

lambda 表达式的主体与嵌套块具有相同的范围。

Source.

如果要分离范围,请将功能放入单独的方法中。

【讨论】:

  • OP 可能会将每个 lambda 放入它自己的组成 lambda 的包装器类中,但这会为没有来自所述 lambda 外部的可访问变量的“特权”创建许多额外的文件。明确地说,这是一个坏主意,你不应该这样做。
  • 当您开始将 lambdas 放入包装类时,我认为使用普通方法会更容易。
  • 我没有说它是智能,只是它是可能的。
  • 当然,我不认为你会认为这很聪明。只是想确保没有人真正这样做;-)。
猜你喜欢
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 2021-01-15
  • 2017-03-01
  • 2013-10-14
  • 1970-01-01
  • 2013-02-22
相关资源
最近更新 更多