vlambda博客
学习文章列表

Java1.8 ​lamda+方法引用 + 函数式接口

Effective Java这本书有一条为

1)lamda优先于译名表达式

2)方法引用 优先于lamda


先说下方法引用和lamda


1
方法引用

我们用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


2
函数式接口



通常Lambda表达式是用在函数式接口上使用的。从Java8开始引入了函数式接口,其说明比较简单:函数式接口(Functional Interface)就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。


java8引入@FunctionalInterface 注解声明该接口是一个函数式接口。


java8实现了很多函数式接口,40多个。


但常用的只有5个:


Consumer< T>:消费型接口 无返回值

Supplier< T>供给型接口 没有参数并返回一个值

Operator 代表参数和返回值一致 可多个参数

Function<T,R>函数型接口</T,R> 代表参数和返回值不一致

Predicate< T>段言型接口 代表一个参数返回 boolean


Predicate 源码:

@FunctionalInterfacepublic 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的策略模式。