我正在尝试学习和理解Java中lambda表达式的使用。
我已经在一个类中编写了一个函数,该函数使用lambda表达式根据Optional
值返回布尔结果。
private boolean isNullOrEmpty(Optional<String> value) {
boolean result;
value.ifPresent(v -> result = isEmptyOrWhitespace(v));
return result;
}
isEmptyOrWhitespace
是我在其他地方定义的一个简单函数,用于检查字符串是否为null或仅包含空格:
private boolean isEmptyOrWhitespace(String value) {
return value == null || value.trim().isEmpty();
问题是,我无法编译它,因为编译器说
variable used in lambda should be final or effectively final
对于result
变量。我看到Java: Assign a variable within lambda遇到了类似的问题,但是问题涉及String,解决方案是事先将其设置为null。
我觉得我很近。我该如何解决?
答案 0 :(得分:4)
问题在于result
并不是有效的最终定论,因为分配给它的任务不止一个。
您可以使用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);
}
答案 1 :(得分:2)
选项A-重写代码:
private boolean isNullOrEmpty(Optional<String> value) {
return value.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];
}
对数组的引用是最终的,不需要包含其内容。
答案 2 :(得分:2)
您可以将filter
与isPresent
一起使用:
value.filter(x-> isEmptyOrWhitespace(x)).isPresent()