函数式接口:Supplier与Consumer
作者:互联网
Supplier接口
Supplier在英文中的意思:供应商。
指提供某种产品。编程中一般认为是生成某种类型的数据。
jdk源码
package java.util.function;
@FunctionalInterface
public interface Supplier<T> {
T get();
}
除了一个抽象方法以外,并没有其它的方法
我们来看看这个接口的一种经典用法
代码样例
public class Main {
public static void main(String[] args) {
int nums[] = {1, 23, 135, 534, 6245, 16254, 3547345};
Integer res = test(() -> {
int max = -1;
for (int num : nums) {
max = Math.max(max, num);
}
return max;
});
System.out.println("最大值:" + res);
}
public static <T> T test(Supplier<T> s) {
return s.get();
}
}
执行结果
最大值:3547345
消费型接口:
Consumer接口
Consumer在英文中的意思:消费者。
指消费某种产品。编程中一般认为是使用某种类型的数据。
jdk源码
package java.util.function;
import java.util.Objects;
@FunctionalInterface
public interface Consumer<T> {
void accept(T var1);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (t) -> {
this.accept(t);
after.accept(t);
};
}
}
除了一个抽象方法以外,还有一个andThen方法。
我们来看看这个接口的一种经典用法。
// 格式化打印
public class Main {
public static void main(String[] args) {
String strs[] = {"张三 男", "李四 男", "小红 女"};
test(strs, (arr) -> {
for (String str : arr) {
String s[] = str.split(" ");
System.out.println(s[0] + ":" + s[1]);
}
});
}
public static <T> void test(T t, Consumer<T> c) {
c.accept(t);
}
}
执行结果
张三:男
李四:男
小红:女
当想将上面的数据正向与逆向输出两遍怎么办?
// 正向与逆向格式化打印
public class Main {
public static void main(String[] args) {
String strs[] = {"张三 男", "李四 男", "小红 女"};
test(strs, (arr) -> {
System.out.println("------正序输出------");
for (String str : arr) {
String s[] = str.split(" ");
System.out.println(s[0] + ":" + s[1]);
}
});
test(strs, (arr) -> {
System.out.println("------逆序输出------");
for (int i = arr.length - 1; i >= 0; i --) {
String s[] = arr[i].split(" ");
System.out.println(s[0] + ":" + s[1]);
}
});
}
public static <T> void test(T t, Consumer<T> c) {
c.accept(t);
}
}
执行结果
------正序输出------
张三:男
李四:男
小红:女
------逆序输出------
小红:女
李四:男
张三:男
好像没有什么问题,这是代码量有点大。
如果我们使用andThen方法来实现这个处理的话,就会简单一些。
// 正向与逆向格式化打印, 使用andThen
public class Main {
public static void main(String[] args) {
String strs[] = {"张三 男", "李四 男", "小红 女"};
Consumer<String[]> c1 = (arr) -> {
System.out.println("------正序输出------");
for (String str : arr) {
String s[] = str.split(" ");
System.out.println(s[0] + ":" + s[1]);
}
};
Consumer<String[]> c2 = (arr) -> {
System.out.println("------逆序输出------");
for (int i = arr.length - 1; i >= 0; i --) {
String s[] = arr[i].split(" ");
System.out.println(s[0] + ":" + s[1]);
}
};
test(strs, c1.andThen(c2));
}
public static <T> void test(T t, Consumer<T> c) {
c.accept(t);
}
}
执行结果
------正序输出------
张三:男
李四:男
小红:女
------逆序输出------
小红:女
李四:男
张三:男
由此看出两种写法等效,并且可以看出andThen可以链接两个Consumer的处理变为一个处理,或者说一起处理。当需要链接的Consumer数量不定时,有非常大的作用。传入的参数只需如下即可。
// c1,c2,c3,c4,c5均为Consumer实例
// 如此一来就可以连续执行c1,c2,c3,c4,c5的处理了
test(strs, c1.andThen(c2).andThen(c3).andThen(c4).andThen(c5));
标签:arr,String,接口,------,Supplier,println,Consumer,public 来源: https://www.cnblogs.com/buzuweiqi/p/16584590.html