死磕Lambda表达式(二)

public interface Callable {

V call() throws Exception;

}

Callable接口只有一个call抽象方法,所以它也是函数式接口。

你可以已经发现了,Callable接口上有一个注解@FunctionalInterface,该注解用于标志该接口是一个函数式接口。如果你编写了一个不是函数式接口的接口,并且加了@FunctionalInterface注解,编译就会报错,需要注意一下。

看了以上的例子,是不是撸胳膊挽袖子准备大干一场?别急,检验出真知,我们先简单测试一下。以下三个接口,哪些是函数式接口,哪些不是函数式接口?

  1. Runnable

package java.lang;

@FunctionalInterface

public interface Runnable {

public abstract void run();

}

  1. Task

package com.sun.jmx.snmp.tasks;

public interface Task extends Runnable {

public void cancel();

}

  1. Serializable

package java.io;

public interface Serializable {

}

请思考片刻…

.

.

.

.

.

.

宣布答案

  1. Runnable只有一个抽象方法run,所以是函数式接口

  2. Task有两个抽象方法,分别是自己的cancel方法和从Runnable继承而来的run方法,所以不是函数式接口。

  3. Serializable没有任何一个方法,所以不是函数式接口。

怎么样?都答对了嘛?

[](()实现函数式接口

了解了什么是函数式接口以后,我们就可以直接使用Lambda表达式为函数式接口提供实现了,并且还可以把整个Lambda表达式作为函数式接口的实例。比如上面提到的Runnable接口,我们就 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 是这样直接赋值:

Runnable runnable = () -> {

System.out.println(“万猫学社”);

};

到目前为止,我们已经知道在哪使用Lambda表达式,那么该如何正确的使用Lambda表达式呢?

[](()怎么使用Lambda表达式?

从上面Runnable接口实例的例子中,可以看出:Runnable接口的run方法没有入参没有返回,该方法的签名是() -> void;Lambda表达式同样的也没有入参没有返回,该表达式的签名是() -> void

也就是说:函数式接口的抽象方法的签名和Lambda表达式的签名必须一致。

再比如,按照品牌给口罩列表进行排序的例子,Comparator接口的compare方法的签名是(T ,T) -> int,Lambda表达式的签名同样也是(T ,T) -> int

为了加深理解,我们再来做个小测试,看看哪些代码正确使用了Lambda表达式?

  1. Callable

Callable callable = () -> {

return “万猫学社”;

};

  1. Runnable

Runnable runnable = () -> {

return “万猫学社”;

你可能感兴趣的:(Java,经验分享,面试,java)