Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在lambda表达式中指定局部变量_Java_String_Lambda_Optional - Fatal编程技术网

Java 在lambda表达式中指定局部变量

Java 在lambda表达式中指定局部变量,java,string,lambda,optional,Java,String,Lambda,Optional,我正在努力学习和理解lambda表达式在Java中的使用 我在类中编写了一个函数,该函数使用lambda表达式返回基于可选值的布尔结果 private boolean isNullOrEmpty(Optional<String> value) { boolean result; value.ifPresent(v -> result = isEmptyOrWhitespace(v)); return result; } 问题是,我不能编译这个,因为编译器说 v

我正在努力学习和理解lambda表达式在Java中的使用

我在类中编写了一个函数,该函数使用lambda表达式返回基于
可选值的布尔结果

private boolean isNullOrEmpty(Optional<String> value) {
  boolean result;
  value.ifPresent(v -> result = isEmptyOrWhitespace(v));

  return result;
} 
问题是,我不能编译这个,因为编译器说

variable used in lambda should be final or effectively final
对于
结果
变量。我见过类似的问题,但问题涉及字符串,解决方法是事先将其设置为null


我觉得我很接近。如何解决此问题?

问题在于,
结果
不是有效的最终结果,因为它有多个赋值

您可以使用
Optional.map

private boolean isNullOrEmpty(Optional<String> value) {
  return value.map(v -> isEmptyOrWhitespace(v)) //Or can use a Method reference as mentioned by Bohemian@
        .orElse(false);
} 
private boolean isNullOrEmpty(可选值){
返回值.map(v->isEmptyOrWhitespace(v))//或者可以使用Bohemian提到的方法引用@
.orElse(假);
} 

选项A-重写代码:

private boolean isNullOrEmpty(Optional<String> value) {
    return value.map(MyClass::isEmptyOrWhitespace).orElse(false);
}
private boolean isNullOrEmpty(可选值){
返回值.map(MyClass::isEmptyOrWhitespace).orElse(false);
}
备选方案B——规避“有效最终”限制:

private boolean isNullOrEmpty(Optional<String> value) {
    boolean[] result = {false};
    value.ifPresent(v -> result[0] = isEmptyOrWhitespace(v));
    return result[0];
} 
private boolean isNullOrEmpty(可选值){
布尔[]结果={false};
value.ifPresent(v->result[0]=isEmptyOrWhitespace(v));
返回结果[0];
} 

对数组的引用是最终的,其内容不必是。

您可以使用
过滤器
isPresent

value.filter(x-> isEmptyOrWhitespace(x)).isPresent()

如果
可选
为空,代码应该返回什么?@daniu对延迟表示抱歉。它应该返回true。大多数情况下,如果您调用
可选。get
isPresent
,则说明您做得不对。@lexicore我可以联系一下,这就像python中的坏习惯101,您永远不应该使用全局变量或用动态变量污染名称空间。谢谢你的信息!Map听起来是最明智的方法(当然不像B那么老练)。这很有帮助,我回家后会测试一下。根据这里的评论,我认为使用lambda是不可能的。有没有办法弄清楚什么构造适用于什么情况?还有一件事。如果可选项为空,此选项是否仍然有效?我猜是的,这就是orElse()位的用途?抱歉,如果这是一个愚蠢的问题,我不习惯这些Java 8表达式。@Bohemian我很抱歉,但我不赞成绕过“有效最终”限制部分。我认为这是一个可怕的建议。刚刚测试过,选项a是完美的。我也不知道
语法。好东西,谢谢@波西米亚式的,它将“副作用编程”与函数式风格结合在一起。如果有方法参考,会更好。@lexicore是的。我在评论中提到过,为什么不在你的回答中呢?大多数人不会阅读问题中的所有评论。@lexicore我更愿意重定向到其他人已经写好的答案,因为它已经存在了。我会修改/编辑答案,只要它真的有意义(w.r.t对性能/功能的影响)。当然,这是你的决定。我的方法通常是问“对未来的读者来说什么是最好的?”
value.filter(x-> isEmptyOrWhitespace(x)).isPresent()