JDK8 函数式接口

JDK8中为了适应函数式响应编程模式,引入了函数式接口概念以增长Lambda表达式的功能。函数式接口其实本质上仍是一个接口,可是它是一种特殊的接口:SAM类型的接口(Single Abstract Method)。定义了这种类型的接口,使得以其为参数的方法,能够在调用时,使用一个lambda表达式做为参数。从另外一个方面说,一旦咱们调用某方法,能够传入lambda表达式做为参数,则这个方法的参数类型,一定是一个函数式的接口,这个类型一定会使用@FunctionalInterface进行修饰。html

  从SAM原则上讲,这个接口中,只能有一个函数须要被实现,可是也能够有以下例外:java

    1. 默认方法与静态方法并不影响函数式接口的契约,能够任意使用,即编程

      函数式接口中能够有静态方法,一个或者多个静态方法不会影响SAM接口成为函数式接口,而且静态方法能够提供方法实现app

      能够由 default 修饰的默认方法方法,这个关键字是Java8中新增的,为的目的就是使得某一些接口,原则上只有一个方法被实现,可是因为历史缘由,不得不加入一些方法来兼容整个JDK中的API,因此就须要使用default关键字来定义这样的方法函数

    2. 能够有 Object 中覆盖的方法,也就是 equals,toString,hashcode等方法。.net

  JDK中之前全部的函数式接口都已经使用 @FunctionalInterface 定义,能够经过查看JDK源码来确认,如下附JDK 8以前已有的函数式接口:code

            java.lang.Runnablehtm

            java.util.concurrent.Callableblog

            java.security.PrivilegedAction接口

            java.util.Comparator

            java.io.FileFilter

            java.nio.file.PathMatcher 

            java.lang.reflect.InvocationHandler

            java.beans.PropertyChangeListener

            java.awt.event.ActionListener  

            javax.swing.event.ChangeListener

https://www.cnblogs.com/ownraul/p/5551545.html
http://blog.csdn.net/zjq_1314520/article/details/73556167

JDK8中新增的主要函数式接口以下:

public void testCoreInter(){
/**
* @name 消费型接口
* @use Consumer<T>
* @param T 传入参数
* @fun 接受一个参数 无返回值
* */
Consumer<String> con=(str)->System.out.println(str);
con.accept("我是消费型接口!");

/**
* @name 供给型接口
* @use Supplier<R>
* @param R 返回值类型
* @fun 无参数 有返回值
* */
Supplier<Date> supp=()-> new Date();
Date date=supp.get();
System.out.println("当前时间:"+date);

/** * @name 函数型接口 * @use Function<T,R> * @param T 传入参数 * @return R 返回值类型 * @fun 接受一个参数 有返回值 * */ Function<String, String> fun=(str)->"hello,"+str; String str=fun.apply("张俊强"); System.out.println(str); /** * @name 判定型接口 * @use Predicate<T> * @param T 传入参数 * @return Boolean 返回一个Boolean型值 * @fun 接受一个参数 返回Boolean型值 * */ Predicate<Integer> pre=(num)->num>0; Boolean flag=pre.test(10); System.out.println(flag); }