Java:在lambda中分配一个变量

Geo*_*rge 9 java regex variables lambda java-8

我不能用Java做到这一点:

Optional<String> optStr = Optional.of("foo");
String result;
optStr.ifPresent(s -> result = s);
Run Code Online (Sandbox Code Playgroud)

该文档说lambda中使用的变量必须是有效的.那么如何很好地从lambda中提取和存储一些东西呢?

实际上真正的用例更复杂.
我想用一个接一个地将几个正则表达式应用于一个字符串matcher.replaceAll.我在forEach lambda中这样做,并想在某处存储中间结果.

Tun*_*aki 6

答案很简单:你不能(直接)这样做.

一个非常丑陋的黑客是改变外部对象而不是分配给变量:

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

sb有效的,因为这里有效

但我想强调一点,这可能不是你真正想要做的.

  • 如果您想拥有默认值,请使用optStr.orElseoptStr.orElseGet代替.
  • 如果要仅在存在时映射结果,请使用 optStr.map

由于你没有提供你的整个用例,这些只是猜测,但关键是我真的不推荐上面的代码片段:它违背了函数式编程的概念(通过改变一个对象).

  • @George因为"在forEach中增加一个外部整数计数器"听起来很像过滤然后计数,这将是一种功能性的方法.话虽如此,您还可以创建自己的`MutableInteger`并增加该对象.你不能分配,但你可以改变. (3认同)