函数式接口
定义:有且仅有一个抽象方法的接口,一般会有@FunctionalInterface注释。
例如:Runnable,Comparator,Supplier,Predicate,Function,Consumer。
1.Supplier接口
接口仅包含一个无参方法:T get(),用来获得一个泛型参数指定的对象类型。
public static Person ceratePerson(Supplier<Person> supplier){
return supplier.get();
}
public static void main(String[] args) {
String name = "张三";
int age = 20;
Person p = ceratePerson(() -> new Person(name,age));
System.out.println(p);
}
可以得到一个Person对象
2.Consumer接口
接口包含一个抽象方法:void accept(T t),消费一个指定泛型的数据,还有一个默认方法:andThen(Consumer c),消费数据的时候可以先做一个操作,再做另一个操作。
accept(T t)
public static void consumeString(Consumer<Person> consumer, Person p){
consumer.accept(p);
}
public static void main(String[] args) {
consumeString((t) -> {
System.out.println(t.getName() + "今年" + t.getAge() + "岁了!");
},new Person("张三",18));
}
andThen(Consumer<> c)
public static void print(Consumer<Person> p1,Consumer<Person> p2,Person p){
p1.andThen(p2).accept(p);
// 等价于执行一次p1.accept(p);和一次p2.accept(p);
}
public static void main(String[] args) {
Person p = new Person("张三",18);
print((t) -> {System.out.print(t.getName() + "有孩子了!");},
(t) ->{System.out.println("孩子今年" + t.getAge() + "岁了!");},p);
}
3.Predicate接口
用来对数据类型进行判断,包含一个抽象方法boolean test(T t)和默认方法 Predicate and(Predicate),Predicate or(Predicate),Predicate negate()和静态方法Predicate isEqual(Object)。
test(T t)
public static void print(Predicate<Person> predicate,Person[] p){
for (Person person:p) {
if(predicate.test(person))
System.out.println(person);
}
}
public static void main(String[] args) {
Person[] ps = {new Person("张三",18),
new Person("吴某",30),
new Person("胡歌",40),
new Person("蔡徐坤",50),
new Person("蔡帆帆",20),
new Person("吴哥",25)};
print(p -> p.getName().startsWith("蔡"),ps);
}
and(Predicate),or(Predicate),negate()用法相似,拿or举例
public static void print(Predicate<Person> predicate1, Predicate<Person> predicate2,Person[] ps){
for (Person p:ps) {
if(predicate1.or(predicate2).test(p))
System.out.println(p.getName() + "哥哥会唱跳rap打篮球");
}
}
public static void main(String[] args) {
Person[] ps = {new Person("张三",18),
new Person("胡歌",30),
new Person("鸡",40),
new Person("蔡徐坤",50),
new Person("蔡帆帆",20),
new Person("吴哥",25)};
print(p -> p.getName().startsWith("蔡"),(p) -> {return p.getName().startsWith("鸡");},ps);
}
4.Function接口
可以根据一个类型数据得到另一个类型数据,包含一个抽象方法R apply(T t) 将T类型转换成R类型和两个默认方法Function compose(Function f)和Function andThen(Function f),还有一个静态方法Function identity()。
R apply(T t)
public static Date transfer(Function<String , Date> function,String str){
return function.apply(str);
}
public static void main(String[] args) {
System.out.println(transfer((s) -> {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
return sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
},"2022-01-19 11:21:21"));
}
Function andThen(Function f)实现组合操作
public static Person transfr(Function<String, Date> function1,Function<Date,Person> function2,String str){
return function1.andThen(function2).apply(str);
//等价于 Date date = function1.apply(str);
//return function2.apply(date);
}
public static void main(String[] args) {
Person p = transfr((s) -> {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
try {
return sdf.parse(s);
} catch (ParseException e) {
e.printStackTrace();
}
return null;}, (date) -> {
return new Person("aaa",18);
},"2022-01-19 11:21:21");
System.out.println(p);
}