函数式接口
概念:
函数式接口在Java中是指:有且仅有⼀个抽象方法的接口。
函数式接口注解 @FunctionalInterface - > JDK8
@xxx -> 注解 :给JVM看 参与编译 // /**/ -> 注释:给程序员看,不参与编译
⼀旦使用该注解来定义接口,编译器将会强制检查该接口是否确实有且仅有⼀个抽象方法,否则将会报错。需要注意的是,即使不使用该注解,只要满足函数式接口的定义,这仍然是⼀个函数式接口,使用起来都⼀样。
4个常用的函数式接口:
- Supplier : 生产者 -> T get():生产对象
- Consumer :消费者 -> void accept(T t)
- Predicate:判断 -> boolean test(T t):判断t对象,判断逻辑自定义
- Function<T, R> function1: 类型转换
R apply(T t): 将t对象 转换成 R 类型
Function andThen(Function<R, V> after):
function1.andThen(Function<R, V> after).apply(T t)
R r = function1.apply(T t);
V v = after.apply(R r);
Supplier实现:
主函数:
public class Demo1 {
//为了使用Lambda表达式,定义了一个方法,将Supplier作为方法参数
//Supplier是一个函数式接口
public static Person creatPerson(Supplier<Person> supplier) {
return supplier.get();
}
public static void main(String[] args) {
String name = "lucy";
int age = 18;
//传统方法实现
Person p1 = creatPerson(new Supplier<Person>() {
@Override
public Person get() {
return new Person(name, age);
}
});
System.out.println(p1);
//参数是一个函数是接口,所以可以使用lambda表达式
//Supplier的方法是 T get() T -> Person
//lambda表达式简化后实现
Person p2 = creatPerson(() -> new Person(name, age));
System.out.println(p2);
}
}
Person类:
public class Person {
private String name;
private int age ;
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Person{name='lucy', age=18}
Person{name='lucy', age=18}
Consumer实现:
实现1:
public class Demo2Consumer {
//Consumer是一个函数式接口
public static void print(Consumer<Person> consumer, Person p) {
consumer.accept(p);
}
public static void main(String[] args) {
String name = "lucy";
int age = 18;
Person p = new Person(name, age);
//传统方法实现
print(new Consumer<Person>() {
@Override
public void accept(Person p) {
System.out.println(p.getName() + "今年" + p.getAge() + "岁");
}
}, p);
//lambda表达式简化后实现
print((t -> System.out.println(t.getName() + "今年" + t.getAge() + "岁!")),p);
}
}
lucy今年18岁
lucy今年18岁!
实现2:
public class Demo2ConsumerAndthen {
//Consumer是一个函数式接口
public static void print(Consumer<Person> consumer1, Consumer<Person> consumer2, Person p) {
consumer1.andThen(consumer2).accept(p);
}
public static void main(String[] args) {
String name = "lucy";
int age = 18;
Person p = new Person(name, age);
//传统方法实现
print(new Consumer<Person>() {
@Override
public void accept(Person p) {
System.out.print("她的名字叫" + p.getName());
}
}, new Consumer<Person>() {
@Override
public void accept(Person person) {
System.out.println("今年" + p.getAge() + "岁了");
}
}, p);
//lambda表达式简化后实现
print(t -> System.out.print("她的名字叫" + t.getName()),
t -> System.out.println("今年" + p.getAge() + "岁了!!"), p
);
}
}
她的名字叫lucy今年18岁了
她的名字叫lucy今年18岁了!!
Predicate实现:
实现1:
public class Demo3Predicate {
public static void print(Predicate<Person> predicate, Person[] ps) {
for (Person p : ps) {
if (predicate.test(p)) {
System.out.println(p);
}
}
}
public static void main(String[] args) {
Person[] ps = {new Person("张三", 15),
new Person("张翰", 30),
new Person("王五", 18),
new Person("张无忌", 60),
new Person("王五", 56)
};
//传统写法:
//打印姓张的人
print(new Predicate<Person>() {
@Override
public boolean test(Person p) {
return p.getName().startsWith("张");
}
}, ps);
System.out.println("----------------");
//简化写法
print(t->t.getName().startsWith("张"),ps);
}
}
Person{name='张三', age=15}
Person{name='张翰', age=30}
Person{name='张无忌', age=60}
----------------
Person{name='张三', age=15}
Person{name='张翰', age=30}
Person{name='张无忌', age=60}
实现2:
public class Demo3PredicateAnd {
public static void print(Predicate<Person> predicate1, Predicate<Person> predicate2, Person[] ps) {
for (Person p : ps) {
if (predicate1.and(predicate2).test(p)) {
System.out.println(p);
}
}
}
public static void main(String[] args) {
Person[] ps = {new Person("张三", 15),
new Person("张翰", 30),
new Person("王五", 18),
new Person("张无忌", 60),
new Person("王五", 56)
};
//传统写法:
//打印姓张的人,且年龄小于50岁
print(new Predicate<Person>() {
@Override
public boolean test(Person person) {
return person.getName().startsWith("张");
}
}, new Predicate<Person>() {
@Override
public boolean test(Person person) {
return person.getAge() < 50;
}
}, ps);
System.out.println("----------------");
//简化写法
print(t -> t.getName().startsWith("张"),
t -> t.getAge() < 50, ps);
}
}
Person{name='张三', age=15}
Person{name='张翰', age=30}
----------------------------
Person{name='张三', age=15}
Person{name='张翰', age=30}
Function实现:
主函数:
public class Demo4Transfer {
public static Date transfer(Function<String, Date> function, String str) {
return function.apply(str);
}
public static void main(String[] args) {
String str1 = "2022-07-19 11:48:19";
//传统写法
Date date = transfer(new Function<String, Date>() {
@Override
public Date apply(String s) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return sdf.parse(str1);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}, str1);
System.out.println(date);
String str2 = "2022-07-19 11:49:27";
//简化写法
Date date1 = transfer((t) -> {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return sdf.parse(t);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}, str2);
System.out.println(date1);
}
}
Tue Jul 19 11:48:19 CST 2022
Tue Jul 19 11:49:27 CST 2022