相关疑难解决方法(0)

Lambda表达式和方法重载疑问

好的,所以方法重载是一个糟糕的事情.既然已经解决了这个问题,我们假设我实际上想要重载这样的方法:

static void run(Consumer<Integer> consumer) {
    System.out.println("consumer");
}

static void run(Function<Integer, Integer> function) {
    System.out.println("function");
}
Run Code Online (Sandbox Code Playgroud)

在Java 7中,我可以使用非模糊的匿名类作为参数轻松地调用它们:

run(new Consumer<Integer>() {
    public void accept(Integer integer) {}
});

run(new Function<Integer, Integer>() {
    public Integer apply(Integer o) { return 1; }
});
Run Code Online (Sandbox Code Playgroud)

现在在Java 8中,我当然想用lambda表达式调用这些方法,我可以!

// Consumer
run((Integer i) -> {});

// Function
run((Integer i) -> 1);
Run Code Online (Sandbox Code Playgroud)

既然编译器应该能够推断出来Integer,为什么我不离开Integer呢?

// Consumer
run(i -> {});

// Function
run(i -> 1);
Run Code Online (Sandbox Code Playgroud)

但这不编译.编译器(javac,jdk1.8.0_05)不喜欢这样:

Test.java:63: error: reference to run is …
Run Code Online (Sandbox Code Playgroud)

java lambda overloading jls java-8

48
推荐指数
1
解决办法
8369
查看次数

为什么必须用lambda体中的完整代码块来包含throw语句?

如果lambda函数中有一个语句,我们可以省略为它定义完整的代码块:

new Thread(() -> System.out.println());
Run Code Online (Sandbox Code Playgroud)

为什么抛出异常的语句不是这种情况?这会产生一个编译错误,说明'{' expected:

new Thread(() -> throw new RuntimeException());
Run Code Online (Sandbox Code Playgroud)

当然,将lambda主体封装在代码块中可以:

new Thread(() -> {
    throw new RuntimeException();
});
Run Code Online (Sandbox Code Playgroud)

java lambda exception java-8

37
推荐指数
3
解决办法
793
查看次数

标签 统计

java ×2

java-8 ×2

lambda ×2

exception ×1

jls ×1

overloading ×1