- Supplier 接口
Supplier接口产生一个给定类型的结果。Supplier没有输入参数。
源码:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
案例:
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
Supplier<Person> supplier=Person::new;
List<Person> personList = new ArrayList<>();
Person p1 = supplier.get();
p1.setName("Kobe");
p1.setAge(18);
personList.add(p1);
作用:可以把耗资源运算放到get方法里,在程序里传递的是Supplier对象,直到调用get方法时,运算才会执行。这就是所谓的惰性求值。
2. Consumer 接口
@FunctionalInterface
public interface Consumer<T> {
/**
*对给定参数执行此操作。
*
*@param t输入参数
*/
void accept(T t);
/**传入一个Consumer类型的参数,
*他的泛型类型,
*跟本接口是一致的T,先做本接口的accept操作,
*然后在做传入的Consumer类型的参数的accept操作
*/
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
这个接口,接收一个泛型的参数T,然后调用accept,对这个参数做一系列的操作,没有返回值;
案例:accept
Consumer<String[]> con1=(msg) ->{
System.out.print("姓名:" + msg[0]+ ";成绩:"+msg[1]);
};
con1.accept(new String[]{"张三","785"});
案例: andThen
连接两个Consumer接口,并执行
public static void main(String[] arg){
String[] strArr = new String[]{"张三","785"};
printInfo(strArr,(message)->{
System.out.println("姓名:" + message[0] + ";成绩:"+message[1]);
},(message)->{
System.out.println("姓名:" + message[0] + ";是否合格:"+ (Integer.parseInt(message[1])>500?"合格":"不合格"));
});
}
public static void printInfo(String[] strArr, Consumer<String[]> con1, Consumer<String[]> con2){
con1.andThen(con2).accept(strArr);
}
其他函数接口:
java.util.function 它包含了很多类,用来支持 Java的 函数式编程,该包中的函数式接口有:
序号 |
接口 & 描述 |
1 |
BiConsumer 代表了一个接受两个输入参数的操作,并且不返回任何结果 |
2 |
BiFunction 代表了一个接受两个输入参数的方法,并且返回一个结果 |
3 |
BinaryOperator 代表了一个作用于于两个同类型操作符的操作,并且返回了操作符同类型的结果 |
4 |
BiPredicate 代表了一个两个参数的boolean值方法 |
5 |
BooleanSupplier 代表了boolean值结果的提供方 |
6 |
Consumer 代表了接受一个输入参数并且无返回的操作 |
7 |
DoubleBinaryOperator 代表了作用于两个double值操作符的操作,并且返回了一个double值的结果。 |
8 |
DoubleConsumer 代表一个接受double值参数的操作,并且不返回结果。 |
9 |
DoubleFunction 代表接受一个double值参数的方法,并且返回结果 |
10 |
DoublePredicate 代表一个拥有double值参数的boolean值方法 |
11 |
DoubleSupplier 代表一个double值结构的提供方 |
12 |
DoubleToIntFunction 接受一个double类型输入,返回一个int类型结果。 |
13 |
DoubleToLongFunction 接受一个double类型输入,返回一个long类型结果 |
14 |
DoubleUnaryOperator 接受一个参数同为类型double,返回值类型也为double 。 |
15 |
Function 接受一个输入参数,返回一个结果。 |
16 |
IntBinaryOperator 接受两个参数同为类型int,返回值类型也为int 。 |
17 |
IntConsumer 接受一个int类型的输入参数,无返回值 。 |
18 |
IntFunction 接受一个int类型输入参数,返回一个结果 。 |
19 |
IntPredicate :接受一个int输入参数,返回一个布尔值的结果。 |
20 |
IntSupplier 无参数,返回一个int类型结果。 |
21 |
IntToDoubleFunction 接受一个int类型输入,返回一个double类型结果 。 |
22 |
IntToLongFunction 接受一个int类型输入,返回一个long类型结果。 |
23 |
IntUnaryOperator 接受一个参数同为类型int,返回值类型也为int 。 |
24 |
LongBinaryOperator 接受两个参数同为类型long,返回值类型也为long。 |
25 |
LongConsumer 接受一个long类型的输入参数,无返回值。 |
26 |
LongFunction 接受一个long类型输入参数,返回一个结果。 |
27 |
LongPredicate R接受一个long输入参数,返回一个布尔值类型结果。 |
28 |
LongSupplier 无参数,返回一个结果long类型的值。 |
29 |
LongToDoubleFunction 接受一个long类型输入,返回一个double类型结果。 |
30 |
LongToIntFunction 接受一个long类型输入,返回一个int类型结果。 |
31 |
LongUnaryOperator 接受一个参数同为类型long,返回值类型也为long。 |
32 |
ObjDoubleConsumer 接受一个object类型和一个double类型的输入参数,无返回值。 |
33 |
ObjIntConsumer 接受一个object类型和一个int类型的输入参数,无返回值。 |
34 |
ObjLongConsumer 接受一个object类型和一个long类型的输入参数,无返回值。 |
35 |
Predicate 接受一个输入参数,返回一个布尔值结果。 |
36 |
Supplier 无参数,返回一个结果。 |
37 |
ToDoubleBiFunction 接受两个输入参数,返回一个double类型结果 |
38 |
ToDoubleFunction 接受一个输入参数,返回一个double类型结果 |
39 |
ToIntBiFunction 接受两个输入参数,返回一个int类型结果。 |
40 |
ToIntFunction 接受一个输入参数,返回一个int类型结果。 |
41 |
ToLongBiFunction 接受两个输入参数,返回一个long类型结果。 |
42 |
ToLongFunction 接受一个输入参数,返回一个long类型结果。 |
43 |
UnaryOperator 接受一个参数为类型T,返回值类型也为T。 |