一、函数式接口
1.1概念
1.2格式
1.3@FunctionalInterface注解
@FunctionalInterface注解
作用:可以检测接口是否是一个函数式接口
是:编译成功
否:编译失败(接口中没有抽象方法或者抽象方法的个数多余1个)
1.4自定义函数式接口
二、函数式编程
2.1 Lambda的延迟执行
性能浪费的日志案例
体验Lambda的更优写法
证明Lambda的延迟
2.2使用Lambda作为参数和返回值
三、常用函数式接口
3.1 Supplier接口
java.util.function.Supplier<T>接口仅包含一个无参的方法:T get()。
用来获取一个泛型参数指定类型的对象数据。
Supplier<T>接口被称之为生产型接口,指定接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据
3.2练习∶求数组元素最大值
3.3 Consumer接口
抽象方法: accept
java.util.function.Consumer<T>接口则正好与supplier接口相反,它不是生产一个数据,而是消费一个数据,其数据类型由泛型决定。
Consumer接口中包含抽象方法void accept(T t),意为消费一个指定泛型的数据。
Consumer接口是一个消费型接口,泛型执行什么类型,就可以使用accept方法消费什么类型的数据
至于具体怎么消费(使用)需要自定义(输出,计算....)
默认方法: andThen
consumer接口的默认方法andThen
作用:需要两个consumer接口,可以把两个Consumer接口组合到一起,再对数据进行消费
例如:
consumer<String> con1
consumer<String> con2
string s = "hello";
con1.accept( s);
con2.accept(s);
连接两个consumer接口再进行消费
con1.andThen(con2).accept(s);谁写前边谁先消费
3.4练习:格式化打印信息
3.5 Predicate接口
抽象方法:test
java.util.function.Predicate<T>接口
作用:对某种数据类型的数据进行判街,结果返回一个boolean值
Predicate接口中包含一个抽象方法:
boolean test(T t):用来对指定数据类型数据进行判断的方法
结果:
符合条件,返回true
不符合条件,返回false逻辑表达式:可以连接多个判断的条件
&&:与运算符,有false则false
||:或运算符,有true则true
!:非(取反)运算符,非真则假,非假则真
默认方法
Predicate接口中有一个方法and,表示并且关系,也可以用于连接两个判断条件
default Predicate<T> and(Predicate<? super T> other){
Object.requireNonNull(other);
return(t) ->this.test(t) && other.test(t);
}
方法内部的两个判断条件也是用&&连接起来的Predicate接口中有一个方法or,表示或者关系,也可以用于连接两个判断条件
default Predicate<T> or(Predicate<? super T> other){
Object.requireNonNull(other);
return(t) ->this.test(t) || other.test(t);
}
方法内部的两个判断条件也是用||连接起来的Predicate接口中有一个方法negate,也表示取反的意思
default predicate<T> negate() {
return (t) ->!test(t);
}
3.6 练习:集合信息筛选
3.7Function接口
抽象方法:apply
java.util.Function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据,
前者称为前置条件,后者称为后置条件。
Function接口中最主要的抽象方法为:R apply(T t),根据类型T的参数获取类型R的结果。
使用的场景例如:将string类型转换为Integer类型。
默认方法andThen
Function接口中的默认方法andThen:用来进行组合操作