首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Java8中的Lambda表达式

Java8中的Lambda表达式
EN

Stack Overflow用户
提问于 2015-11-12 21:15:59
回答 2查看 3.2K关注 0票数 9
代码语言:javascript
复制
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)方法?

EN

回答 2

Stack Overflow用户

发布于 2015-11-12 21:22:07

lambda表达式提供了函数接口的实现。这就是您的代码片段所做的事情。

您对invoke的调用传递了一个不带参数的返回值的lambda表达式(在本例中为boolean )。因此它匹配Object invoke(Callable c),而不是void invoke(Runnable r) (因为Callablecall方法有返回值,而Runnablerun方法不返回任何值)。

代码语言:javascript
复制
invoke(() -> {System.out.println("something");});

将调用void invoke(Runnable r),因为在本例中,lambda表达式没有返回类型。

票数 8
EN

Stack Overflow用户

发布于 2016-09-13 12:01:29

看看下面的例子。

代码语言:javascript
复制
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);
}

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33672302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档