代码之家  ›  专栏  ›  技术社区  ›  cs95 abhishek58g

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

  •  3
  • cs95 abhishek58g  · 技术社区  · 7 年前

    我试图学习和理解在Java中使用lambda表达式。

    我在类中编写了一个函数,该函数返回基于 Optional 使用lambda表达式的值。

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

    isEmptyOrWhitespace 是我在别处定义的一个简单函数,用于检查字符串是否为空或只有空格:

    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 有一个类似的问题,但问题涉及到字符串,解决方法是预先将其设置为空。

    我觉得我很亲近。我怎么修这个?

    3 回复  |  直到 7 年前
        1
  •  2
  •   Bohemian    7 年前

    选项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
  •  4
  •   Thiyagu    7 年前

    问题是 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);
    } 
    
        3
  •  2
  •   Shubhendu Pramanik    7 年前

    你可以用 filter 具有 isPresent 以下内容:

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