当前位置: 首页 > 知识库问答 >
问题:

Java8捕获22与lambda表达式和有效的最终

索卓
2023-03-14

我正在玩Java 8,遇到了一个基本的场景,它展示了一个第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;
}

我收到编译错误:

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

如果我将第一行更改为:

List<String> result;

最后一行出现编译错误:

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

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

共有3个答案

鲍向笛
2023-03-14

forEach(...)流的每个元素应用一个操作。你真的不想要那个,你想要一个“消费者”,它产生列表的单个输出

幸运的是,这些在当前框架中被认为是Collectors,并且Collectors.toList()完全符合您的要求。

List<String> duplicate = input.stream().collect(Collectors.toList());

太叔马鲁
2023-03-14

用input将声明推入块内!= null。示例:

public static List<String> catch22(List<String> input) {
    if (input != null) {
        List<String> result;
        result = new ArrayList<>(input.size());
        input.forEach(e -> result.add(e)); // compile error here
        return result;
    } else {
        return null; // or empty list or something that suits your app
    }
}
沃威
2023-03-14

出现错误是因为<code>结果外部。但我认为这不是个好主意。您当前的方法没有任何成效。从中返回一个空列表更有意义。

话虽如此,我想说的是,既然你正在玩Java 8,那么在这里使用Optable和流:

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,并且遇到了一个基本场景,该场景说明了catch 22,其中修复一个编译错误会导致另一个编译错误。该场景(这只是从更复杂的示例中简化而来的一个示例): 我收到一个编译错误: 封闭范围中定义的局部变量结果必须是final或有效的final 如果我将第一行更改为: 我在最后一行收到编译错误: 局部变量结果可能尚未初始化 似乎这里唯一的方法是将我的结果预先初始化为Arr

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

  • 我在Eclipse Luna下有一个Java项目,EclEmma2.3.1.201405111647(最新),使用Jacoco 0.7.1,支持Java8,如他们的变更日志所述: “2.3.1版(2014/05/11) 我现在有以下toString: 我不会使用JUnit测试,因为我知道它的覆盖率是100%。我可以通过将lamdba表达式移动到appendToString方法中来证明这一点,并用(

  • 本文向大家介绍Java8之lambda表达式基本语法,包括了Java8之lambda表达式基本语法的使用技巧和注意事项,需要的朋友参考一下 lambda表达式,即带有参数的表达式,为更清晰地理解lambda表达式,先看如下例子: (1) (1)中代码调用Collections.sort方法对集合进行排序,其中第二个参数是一个类,准确地说是一个匿名内部类,sort方法调用内部类中的compare方法

  • 本文向大家介绍Java8 Lambda表达式详解及实例,包括了Java8 Lambda表达式详解及实例的使用技巧和注意事项,需要的朋友参考一下 第一个Lambda表达式 在Lambda出现之前,如果我们需要写一个多线程可能需要下面这种方式: 上面的例子如果改成使用Lambda就会简单许多: Lambda表达式是一个匿名函数,将行为像数据一样传递,表达式使用 -> 将参数和主体分开, -> 前面是参

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