import java.util.concurrent.Callable;
public class AdvancedLambda {
static void invoke(Runnable r){
r.run();
}
static Object invoke(Callable c) throws Exception {
return c.call();
}
public static void main(String[] args) throws Exception {
String s = (String) invoke(() -> true);
System.out.println(s);
}
}
有人能帮我理解这个吗?我的印象是,只有当我们实现一个接口并覆盖它的方法(用Lambda表达式替换匿名类)时,才能在Java 8中使用lamba表达式。
另外,在什么情况下会调用invoke(Runnable r)
方法?
发布于 2015-11-12 21:22:07
lambda表达式提供了函数接口的实现。这就是您的代码片段所做的事情。
您对invoke
的调用传递了一个不带参数的返回值的lambda表达式(在本例中为boolean
)。因此它匹配Object invoke(Callable c)
,而不是void invoke(Runnable r)
(因为Callable
的call
方法有返回值,而Runnable
的run
方法不返回任何值)。
invoke(() -> {System.out.println("something");});
将调用void invoke(Runnable r)
,因为在本例中,lambda表达式没有返回类型。
发布于 2016-09-13 12:01:29
看看下面的例子。
import javafx.beans.DefaultProperty;
import jdk.nashorn.internal.codegen.CompilerConstants;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
/**
* Created by KUMAJYE on 13/09/2016.
*/
public class ThreadMonitor {
private static int noOfThreads = 0;
public static void main(String[] args) {
ThreadModel threadModel;
noOfThreads = Integer.parseInt(args[0]);
if (noOfThreads > 0) {
threadModel = getThreadingModelForCallsInCallingThread();
} else {
threadModel = getAsynchThreadingModel();
}
}
public static ThreadModel getThreadingModelForCallsInCallingThread() {
ExecutorService executor = Executors.newFixedThreadPool(noOfThreads);
return (r) -> executor.submit(r);
}
public static ThreadModel getAsynchThreadingModel() {
// do execution on same Thread or separate Thread.
// or
// r.run();
return (r) -> new Thread(r).start();
}
interface ThreadModel {
void invoke(Runnable r);
}
}
https://stackoverflow.com/questions/33672302
复制相似问题