四大接口
1.函数式接口
//在这定义一个口罩的类
package one.more.study;
/**
* 口罩
*/
public class Mask {
public Mask(String brand, String type) {
this.brand = brand;
this.type = type;
}
/**
* 品牌
*/
private String brand;
/**
* 类型
*/
private String type;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
1.Supplier接口
//suppier接口是对象实例的提供者,定义了一个叫名叫get的抽象方法
package java.util.function;
@FunctionalInterface
public interface Supplier<T> {
T get();
}
2.Consumer接口
//Consumer接口是一个类似消费者的接口,定义了一个名叫accept的抽象方法,它的入参是一个泛型T对象,没有任何返回(void)
package java.util.function;
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
}
3.Predicate接口
//Predicate接口是判断是与否的接口,定义了一个名叫test的抽象方法,它的入参是一个泛型T对象,并返回一个boolean类型
package java.util.function;
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
4.Function接口
//Function接口是对实例进行处理转换的接口,定义了一个名叫apply的抽象方法,它的入参是一个泛型T对象,并返回一个泛型T对象
package java.util.function;
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
}
//测试方法
public static void main(String[] args) {
//Function接口(提供对象实例)
System.out.println("--------------------------Function接口----------------------------");
Supplier<Mask> supplier = () -> new Mask("3M", "N95");
Mask mask = supplier.get();
System.out.println("Brand: " + mask.getBrand() + ", Type: " + mask.getType());
//Consumer接口(消耗对象实例)
System.out.println("--------------------------Consumer接口----------------------------");
Consumer<Mask> consumer = (Mask mask1) -> {
System.out.println("Brand: " + mask1.getBrand() + ", Type: " + mask1.getType());
};
consumer.accept(supplier.get());
//Predicate接口
System.out.println("--------------------------Predicate接口----------------------------");
Predicate<Mask> n95 = (Mask mask2) -> "N95".equals(mask2.getType());
Predicate<Mask> kn95 = (Mask mask3) -> "KN95".equals(mask3.getType());
System.out.println("是否为N95口罩:" + n95.test(supplier.get()));
System.out.println("是否为KN95口罩:" + kn95.test(supplier.get()));
//Function接口
System.out.println("--------------------------Function接口----------------------------");
Function<Mask, String> brand = (Mask mask4) -> mask4.getBrand();
Function<Mask, String> type = (Mask mask5) -> mask5.getType();
System.out.println("口罩品牌:" + brand.apply(supplier.get()));
System.out.println("口罩类型:" + type.apply(supplier.get()));
}
测试结果:
--------------------------Function接口----------------------------
Brand: 3M, Type: N95
--------------------------Consumer接口----------------------------
Brand: 3M, Type: N95
--------------------------Predicate接口----------------------------
是否为N95口罩:true
是否为KN95口罩:false
--------------------------Function接口----------------------------
口罩品牌:3M
口罩类型:N95
2.相关注解的使用
1.函数式接口@FunctionalInterface的使用说明
通过JDK8源码javadoc,可以知道这个注解有以下特点:
1、该注解只能标记在"有且仅有一个抽象方法"的接口上。
2、JDK8接口中的静态方法和默认方法,都不算是抽象方法。
3、接口默认继承java.lang.Object,所以如果接口显示声明覆盖了Object中方法,那么也不算抽象方法。
4、该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让 编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错。