Java1.8 lamda+方法引用 + 函数式接口
Effective Java这本书有一条为
1)lamda优先于译名表达式
2)方法引用 优先于lamda
先说下方法引用和lamda
我们用Lambda表达式来实现匿名方法。但有些情况下,我们用Lambda表达式仅仅是调用一些已经存在的方法,除了调用动作外,没有其他任何多余的动作,在这种情况下,我们倾向于通过方法名来调用它,而Lambda表达式可以帮助我们实现这一要求,它使得Lambda在调用那些已经拥有方法名的方法的代码更简洁、更容易理解。方法引用可以理解为Lambda表达式的另外一种表现形式。
2、方法引用的分类
类型 | 语法 | 对应的Lambda表达式 |
---|---|---|
静态方法引用 | 类名::staticMethod | (args) -> 类名.staticMethod(args) |
实例方法引用 | inst::instMethod | (args) -> inst.instMethod(args) |
对象方法引用 | 类名::instMethod | (inst,args) -> 类名.instMethod(args) |
构建方法引用 | 类名::new | (args) -> new 类名(args) |
最经典的就是打印:
System.out::println
通常Lambda表达式是用在函数式接口上使用的。从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。
java8引入@FunctionalInterface 注解声明该接口是一个函数式接口。
java8实现了很多函数式接口,40多个。
但常用的只有5个:
Consumer< T>:消费型接口 无返回值
Supplier< T>供给型接口 没有参数并返回一个值
Operator 代表参数和返回值一致 可多个参数
Function<T,R>函数型接口</T,R> 代表参数和返回值不一致
Predicate< T>段言型接口 代表一个参数返回 boolean
Predicate 源码:
public interface Predicate<T> {
/**
* Evaluates this predicate on the given argument.
*
* @param t the input argument
* @return {@code true} if the input argument matches the predicate,
* otherwise {@code false}
*/
boolean test(T t);
...
}
举个例子:
Predicate<String> p01=(str)->str.isEmpty()||str.trim().isEmpty();
/**
* 测试传入的字符串是否为空
*/
System.out.println(p01.test(" "));
其他的都差不多。
所以定义方法的时候可以不仅仅定义变量,还可以定义函数式接口,
调用的时候可以传一个逻辑。
这也是java的策略模式。