我无法在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.orElse
或optStr.orElseGet
。 optStr.map
由于您没有提供完整的用例,所以这些只是猜测,但关键是我真的不建议您使用上述代码段:它与功能编程的概念(通过更改对象)背道而驰。