当前位置: 首页 > 面试题库 >

Java 8使用Lambda表达式捕获22并有效地最终

司空鸣
2023-03-14
问题内容

我正在使用Java 8,并且遇到了一个基本场景,该场景说明了catch
22,其中修复一个编译错误会导致另一个编译错误。该场景(这只是从更复杂的示例中简化而来的一个示例):

public static List<String> catch22(List<String> input) {
    List<String> result = null;
    if (input != null) {
      result = new ArrayList<>(input.size());
      input.forEach(e -> result.add(e)); // compile error here
    }

    return result;
}

我收到一个编译错误:

封闭范围中定义的局部变量结果必须是final或有效的final

如果我将第一行更改为:

List<String> result;

我在最后一行收到编译错误:

局部变量结果可能尚未初始化

似乎这里唯一的方法是将我的结果预先初始化为ArrayList,我不想这样做,或者不使用lambda表达式。我还有其他解决方案吗?


问题答案:

错误即将到来是因为您的result列表无效final,这是在lambda中使用它的要求。一种选择是在if条件内部和return null;外部声明变量。但是我认为那不是个好主意。您当前的方法无法产生任何效果。从中返回一个空列表会更有意义。

说了这么多,我要说的是,由于您正在使用Java
8,因此请Optional在此处与流一起使用:

public static List<String> catch22(List<String> input) {
    return Optional.ofNullable(input)
            .orElse(new ArrayList<String>())
            .stream().collect(Collectors.toList());
}

如果您想返回null,我可能会将您的方法更改为:

public static List<String> catch22(List<String> input) {
    if (input == null) return null;
    return input.stream().collect(Collectors.toList());
    // Or this. B'coz this is really what your code is doing.
    return new ArrayList<>(input);
}


 类似资料:
  • 我正在玩Java 8,遇到了一个基本的场景,它展示了一个第22条军规,即修复一个编译错误会导致另一个编译错误。场景(这只是一个从更复杂的东西简化而来的例子): 我收到编译错误: 封闭范围中定义的局部变量结果必须是最终的或有效的最终结果 如果我将第一行更改为: 最后一行出现编译错误: 局部变量结果可能尚未初始化 似乎这里唯一的方法是将我的结果预先初始化为ArrayList,我不想这样做,或者不使用l

  • 1 Java8 Lambda表达式的介绍 Lambda表达式是Java8中包含的一项新的重要功能。它提供了一种简洁明了的方式来使用表达式表示一个方法接口。在Collection集合中非常有用。它有助于集合元素的迭代,过滤和从集合中提取数据。 Lambda表达式用于提供具有功能接口的接口的实现。它节省了大量代码。在使用Lambda表达式的情况下,我们无需再次定义用于提供实现的方法。我们只编写实现代码

  • 我最近接触了Java8,我正在尝试学习Lambda表达式。我想做一些图形计算,我的代码到目前为止: 所有这些代码都是用于图形的,除了和使用的操作之外,所有内容都是基本的数学(加、减、乘、模),并且可以单独针对每个像素执行。 现在的问题是:有可能在GPU上运行这个吗?或者这甚至是自动基于GPU的?(我记得在什么地方读到过这个,但我不确定)

  • 我有两个地图 和 类型为

  • 既然我有一个带有两个方法的,那么我如何用一个具体的类实现它呢?如何为这两种方法编写Lambda表达式?

  • 本文向大家介绍Java8使用lambda表达式调用静态方法,包括了Java8使用lambda表达式调用静态方法的使用技巧和注意事项,需要的朋友参考一下 Java中的Lambda表达式允许您将功能作为参数传递给方法。您还可以使用lambda表达式调用现有的方法。 方法引用是简单的、易于阅读的lambda表达式,可以通过lambda表达式中的名称调用/引用现有的方法。可以使用方法引用引用类中定义的静态