我无法在Java中执行此操作:

Optional<String> optStr = Optional.of("foo");
String result;
optStr.ifPresent(s -> result = s);

该文档说,lambda中使用的变量必须有效地是最终变量。
那么如何从lambda中提取并存储某些东西到一个变量中呢?

实际上,实际用例更加复杂。
我想使用matcher.replaceAll一个接一个地将几个正则表达式应用于一个字符串。我正在forEach lambda中执行此操作,并希望将中间结果存储在某个位置。

最佳答案

答案很简单:您不能(直接)这样做。

一个非常丑陋的技巧是更改外部对象,而不是分配给变量:

Optional<String> optStr = Optional.of("foo");
StringBuilder sb = new StringBuilder();
optStr.ifPresent(s -> sb.append(s));
String result = sb.toString();

之所以有效,是因为sb在这里是effectively final

但是我想强调一点,这可能不是您真正想要的。
  • 如果要使用默认值,请改用optStr.orElseoptStr.orElseGet
  • 如果要仅在结果存在时映射结果,请使用optStr.map

  • 由于您没有提供完整的用例,所以这些只是猜测,但关键是我真的不建议您使用上述代码段:它与功能编程的概念(通过更改对象)背道而驰。

    07-25 22:41