Ø 基本概念
理解FunctionalInterface(函数式接口,以下简称FI)是学习Java8 Lambda表达式的关键所在。FI的定义其实很简单:任何接口,如果只包含唯一 一个抽象方法,那么它就是一个FI。为了让编译器帮助我们确保一个接口满足FI的要求(也就是说有且仅有一个抽象方法),Java8提供了@FunctionalInterface注解。
对于方法的引用,严格来讲都是需要定义一个接口,可是不管如何进行操作,实际上有可能里面提供了一个包: java.util.function,主要提供以下四种核心接口:
1. 功能性接口(function): public interface Function<T,R>{public R apply(T t);}
------此接口接收一个参数,返回一个处理结果
2. 消费性接口(consumer): public interface Consumer<T>{public void accept(T t);}
------此接口只是接收数据,不返回处理结果
3. 供给性接口(Supplier):publicinterface Supplier<T>{public T get();}
------此接口不接受参数,但是返回处理结果
4. 断言性接口(Predicate):publicinterface Predicate<T>{public boolean test(T t);}
------此接口用于进行判断操作使用
Ø 实战
具体的使用示例:
功能性接口
接口参数并且返回处理结果
/**
* 功能性接口
*/
Function<String,Boolean> fun="##hello"::startsWith; //表示方法中的参数
System.out.println(fun.apply("##"));
消费性接口
接口只是接口参数,并不返回处理结果
/**
* 消费性接口
*/
Consumer<String> cons=System.out :: println;
cons.accept("Hello World");
供给性接口
/**
* 供给型接口
*/
Supplier<String> sup="hello"::toUpperCase;
System.out.println(sup.get());
断言性接口
/**
* 断言性接口
*/
Predicate<String> pre="hello"::equalsIgnoreCase;
System.out.println(pre.test("Hello"));
上面的采用的是函数式接口进行实现的,如果你想把接受一些输入参数并将对输入参数处理过后的结果返回的功能封装到一个方法内,Function接口是一个不错的选择。输入的参数类型和输出的结果类型可以一致或者不一致。具体结果可以试试输出结果看看。
以上四种接口的实现采用的都是方法引用(Method References),也就是一个简单的方法调用而已,也是lambda表达式的一种简化写法。理解了这些再来理解下面说的lambda表达式的话,可能会更加好理解性。