面试之加分项闭包和函数接口

闭包

如果你以前使用过匿名内部类,也许遇到过这样的问题。当你需要匿名内部类所在方法里的变量,必须把该变量声明为 final。如下例子所示:

final String name = getUserName();
button.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent event) {
		System.out.println("hi " + name);
	}
});

Java 8放松了这一限制,可以不必再把变量声明为 final,但其实该变量实际上仍然是 final 的。虽然无需将变量声明为 final,但在 Lambda 表达式中,也无法用作非终态变量。如果坚持用作非终态变量(即改变变量的值),编译器就会报错。

函数接口

上面例子里提到了 ActionListener 接口,我们看一下它的代码:

public interface ActionListener extends EventListener {

    /**
     * Invoked when an action occurs.
     */
    public void actionPerformed(ActionEvent e);
//加入Java开发交流君样:756584822一起吹水聊天
}

ActionListener 只有一个抽象方法:actionPerformed,被用来表示行为:接受一个参数,返回空。记住,由于 actionPerformed 定义在一个接口里,因此 abstract关键字不是必需的。该接口也继承自一个不具有任何方法的父接口:EventListener

我们把这种接口就叫做函数接口。

JDK 8 中提供了一组常用的核心函数接口:
面试之加分项闭包和函数接口_第1张图片
其中 CosumerSupplier 对应,一个是消费者,一个是提供者。

Predicate用于判断对象是否符合某个条件,经常被用来过滤对象。

Function 是将一个对象转换为另一个对象,比如说要装箱或者拆箱某个对象。

UnaryOperator接收和返回同类型对象,一般用于对对象修改属性。BinaryOperator `则可以理解为合并对象。

如果以前接触过一些其他 Java 框架,比如Google Guava,可能已经使用过这些接口,对这些东西并不陌生。所以,其实 Java 8 的改进并不是闭门造车,而是集百家之长。

面试之加分项闭包和函数接口_第2张图片
image

最新2020整理收集的一些高频面试题(都整理成文档),有很多干货,包含mysql,netty,spring,线程,spring cloud、jvm、源码、算法等详细讲解,也有详细的学习规划图,面试题整理等,需要获取这些内容的朋友请加Q君样:756584822

你可能感兴趣的:(IT服务,问答分享,java架构,java,编程语言,javascript,spring,面试)