我想知道是否有人可以向我解释以下怪异现象。我正在使用Java 8 Update 11。
给定这种方法
private <F,T> T runFun(Function<Optional<F>, T> fun, Optional<F> opt) {
return fun.apply(opt) ;
}
如果我首先构造一个函数Object,并将其传递给上面的方法,那么事情就会编译。
private void doesCompile() {
Function<Optional<String>, String> fun = o -> o.orElseThrow(() -> new RuntimeException("nah"));
runFun(fun, Optional.of("foo"));
}
但是,如果我以lambda形式内联函数,则编译器会说
未报告的异常X; 必须被抓住或宣布被抛出
private void doesNotCompile () {
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
}
更新 :原来错误消息由maven缩写。如果直接使用javac编译,则错误为:
error: unreported exception X; must be caught or declared to be thrown
runFun(o -> o.orElseThrow(() -> new RuntimeException("nah")), Optional.of("foo"));
^
where X,T are type-variables:
X extends Throwable declared in method <X>orElseThrow(Supplier<? extends X>)
T extends Object declared in class Optional
另请参阅此处以获取可运行的测试代码。
这就是为我解决问题的原因:
而不是写作
optional.map(this::mappingFunction).orElseThrow(() -> new BadRequestException("bla bla"));
我写:
optional.map(this::mappingFunction).<BadRequestException>orElseThrow(() -> new BadRequestException("bla bla"));
在<BadRequestException>
这些lambda边缘情况下添加显式帮助(这很烦人…)
更新:如果您不能更新到最新的JDK版本,则应…
如果我有一个清单,比如说 我如何才能获得一个名字不同的年龄最大的学生名单?在C#中,使用system.linq GroupBy然后比较,然后用select进行扁平化,这将非常简单,我不太确定如何在Java中实现同样的功能。
我对Java8的新特性有点陌生。我正在学习如何通过条目过滤地图。我已经看了这个教程和这个帖子我的问题,但我无法解决。
奇怪的是,标记为“OK”的行编译得很好,但标记为“Error”的行失败了。它们看起来基本上是一样的。
当试图在文件中运行lambda时,我遇到了一个问题:才允许使用。 我的设置: 在Intellij IDEA的项目结构中,我将项目SDK和项目语言设置为Java8. 模块语言级别为8-Lambdas、类型注释等 使用和 项目字节码版本设置为1.8 Jetty的最新版本(V9.4.31.x) 项目使用插件,在中将 和 设置为1.8
给定一个元素列表,我想获取具有给定属性的元素并将其从列表中删除。我找到的最佳解决方案是: 是否可以在lambda表达式中组合get和删除?
异步操作在线程中执行,与主应用程序线程分开。当应用程序调用方法异步执行操作时,应用程序可以在异步方法执行其任务时继续执行。 示例 下面通过一个例子来理解这个概念。在示例程序中使用IO库接受用户输入。 是一种同步方法。它将阻止执行函数调用之后的所有指令,直到方法完成执行。 等待输入。它停止执行并且在收到用户输入之前不再执行任何操作。 以上示例将产生以下输出 - 在计算中,当某个事件在继续之前等待事件