【问题标题】:Java 8 Lambda Autoboxing Reduce-MethodJava 8 Lambda 自动装箱缩减方法
【发布时间】:2014-11-05 02:47:53
【问题描述】:

我刚刚将我的 NetBeans 从 8.0 更新到 8.0.1,我的 JDK 从 1.8.0 更新到 1.8.0u20。我想我的问题很可能是由 jdk-update 引起的。

在更新之前我能够编译这行代码:

int sum = myIntegerList.stream().reduce(0, (a, b) -> a + b, (c, d) -> c + d);

现在这不会再编译了。 NetBeans 告诉我“无法找到或加载主类”。

现在我必须这样写:

Integer sum = myIntegerList.stream().reduce(0, (a, b) -> a + b, (c, d) -> c + d);

int sum = (int) myIntegerList.stream().reduce(0, (a, b) -> a + b, (c, d) -> c + d);

int sum = myIntegerList.stream().reduce(0, (Integer a, Integer b) -> a + b, (Integer c, Integer d) -> c + d);

有人知道为什么这不再起作用了吗?我做错了吗?

【问题讨论】:

  • "找不到或加载主类" - 这不是编译错误,它只是意味着 NetBeans 不知道哪个类包含 public static void main(String[] args) 方法,或者您正在尝试运行一个没有main 方法的类。这不是问题的真正原因。
  • 我尝试使用 JDK 8u20 在命令行上编译您的代码。编译器因NullPointerException 而崩溃!它看起来像是 JDK 8u20 编译器中的一个错误。
  • 很高兴听到这很可能不是我的错误。谢谢!
  • 您的第一行在 8u20 下编译并运行良好...@Jesper 您运行了什么代码?
  • 我刚刚用 javac 从 1.8.0u20 编译了这个类:import java.util.Arrays; import java.util.List; import java.util.stream.Stream; public class Test { public static void main(String[] args) { List<Integer> myIntegerList = Arrays.asList(1, 2, 3, 4); int sum = myIntegerList.stream().reduce(0, (a, b) -> a+b, (a, b) -> a + b); } } 得到了与 Jesper 相同的 NPE。

标签: java lambda java-8 reduce autoboxing


【解决方案1】:

这似乎是 jdk 版本 1.8.0u20 中的一个错误,在早期 1.8.0u40 中已经修复。但是,Netbeans 似乎有它自己的有问题的编译器的副本,它会在尝试运行已编译的代码时产生干扰。所以把项目的jdk和Netbeans环境改成不同的jdk是不行的,NullPointerException还在报。

唯一的解决方案是禁用自动编译(项目属性/构建/编译→保存时编译)并进行项目的干净构建。然后它应该在没有“找不到主类”错误的情况下运行。 (NullPointerException还是会时不时出现在后台,但不影响编译运行了)

【讨论】:

  • 我可以使用您的解决方案对其进行编译。我希望 NetBeans 能尽快解决这个问题。谢谢!
猜你喜欢
  • 1970-01-01
  • 2011-01-19
  • 1970-01-01
  • 2011-05-02
  • 1970-01-01
  • 1970-01-01
  • 2018-06-20
  • 1970-01-01
  • 2016-09-23
相关资源
最近更新 更多