一、@FunctionalInterface,标注为此注解的接口表明该接口为函数式接口,也就是仅定义一个抽象方法。如果定义多个方法,编译器会报错。此注解不是必须,但是是比较好的最佳实践。类似与@Override注解,表明此方法被重写。
二、方法引用适用场景:
- 任何静态方法
Integer.parseInt(s)
替换为: Integer::pasrInt
- 指向任意类型实例方法。如:
lambda:(Function<T, R>)
(String s) -> s.length()
替换为:String::length
- lambda中调用已经存在一个外部对象.
() -> expensiveTransaction.getValue()
替换为
expensiveTransaction::getValue
三、主要的jdk自带的接口有:
Consumer<T>: (T t) -> void
Predicate<T>: (T t) > boolean
Function<T, R>: (T t) -> R r
Supplier<T>: () -> T t
UnaryOperator<T>: (T t) -> T t
BinaryOperator<T>:(T t1, T t2) -> T t
BiPredicate<L, R>: (L l, R r ) -> boolean
BiFunction<T, U, R>: (T t, U u) -> R r
BiConsumer<T, U>: (T t, U u) -> void
以上函数式接口为了防止自动装箱,都有专门的版本,如IntConsumer,IntPredicate等接口。
网友评论