在lambda表达式内分配局部变量

时间:2018-06-28 03:33:10

标签: java string lambda optional

我正在尝试学习和理解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。

我觉得我很近。我该如何解决?

3 个答案:

答案 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)

您可以将filterisPresent一起使用:

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