请解释Java 8的lambda方法的语法.
有很多解释了那里什么拉姆达功能,但我找不到语法的详尽的解释,而我发现很难学会正确复制的语法,因为我不明白为什么他们"按原样重写.
这是我遇到的一个常见案例,由NetBeans提供:
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
new MainAppJFrame();
});
}
Run Code Online (Sandbox Code Playgroud)
所以,不知何故,以下lambda表达式正在解析为匿名Runnable对象的run()方法:
() -> {
// do stuff
}
Run Code Online (Sandbox Code Playgroud)
这->是lambda语法,对吧?花括号只是包含匿名方法代码.括号是否为空参数,因为在这种情况下我们正在创建一个Runnable.run()方法?
这一点对我来说都不太清楚.我假设编译器知道Runnable根据SwingUtilities.invokeLater(Runnable)方法预期的类型实例化匿名?如果有两种SwingUtilities.invokeLater方法仅在参数列表中有所不同,会发生什么?显然在这个特定情况下没有,但在其他地方可能:
interface ExampleLambdaConsumer {
public void doSomething(Runnable r);
public void doSomething(java.lang.reflect.Method m);
}
class C implements ExampleLambdaConsumer {
// implementations for doSomething methods here
public static void main(String[] args) {
doSomething(() -> {
// lambda method body here …Run Code Online (Sandbox Code Playgroud) 我需要一个Java 8的多线程示例.
我需要能够手动选择线程数.
在下面的示例中,我遇到Thread.currentThread().getName()的问题,我需要使用lambda表达式.
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class Thread {
public static void main(String args[]) {
ExecutorService service = Executors.newFixedThreadPool(10);
for (int i =0; i<100; i++){
service.submit(new Task(i));
}
}
final class Task implements Runnable{
private int taskId;
public Task(int id){
this.taskId = id;
}
@Override
public void run() {
System.out.println("Task ID : " + this.taskId +" performed by "
+ Thread.currentThread().getName());
}
}
Run Code Online (Sandbox Code Playgroud) 声纳提到,这个java代码应该与lambda一起使用,但我从未使用过lamdas,也不知道如何使用它.有人能指出我这个代码的正确版本:?
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override
public void run() {
closeable.close();
logger.info("Close closeable.");
executorPool.shutdown();
logger.info("Shutdown executorPool");
}
}));
Run Code Online (Sandbox Code Playgroud)