java中常用的函数式接口简介说明
下文笔者讲述Java中常见的函数式接口简介说明,如下所示
Consumer接口的andThen默认方法
函数式接口简介
我们将有且只有一个抽象方法的接口称之为"函数式接口"
@FunctionalInterface // 注解:检测接口是否是一个函数式接口
修饰符 interface 接口名称 {
public abstract void method(); // public abstract 还是推荐加上
}
常见的函数式接口
Supplier—get 生产工厂 Consumer—accept 消费,即使用 Predicate—test 判断 Function—apply 类型转换
Supplier——生产工厂
Supplier接口
被称为生产型接口
她将返回指定的数据类型
import java.util.function.Supplier;
public class Demo {
// 这里的语义是:生成一个字符串,生成怎样的字符串呢?这由Lambda表达式决定
private static String getString(Supplier<String> sup) {
return sup.get();
}
public static void main(String[] args) {
String s = getString(()->"java265.com");
System.out.println(s);
}
}
求数组元素最大值
public class Prac {
// 生成怎样的数字呢?这由Lambda表达式决定
private static Integer getMax(Supplier<Integer> sup){
return sup.get();
}
public static void main(String[] args) {
int[] arr = {2, 5, 12, 9};
int max = getMax(()->{
int maxNum = arr[0];
for(int n : arr){
maxNum = Math.max(maxNum, n);
}
return maxNum;
});
System.out.println("数组的最大值为" + max);
}
}
Consumer 消费 使用
生产工厂Supplier相反
Consumer用来消费
使用一个数据
import java.util.function.Consumer;
public class Demo01 {
public static void consume(String s, Consumer<String> con){
con.accept(s);
}
public static void main(String[] args) {
// 使用方式:打印
consume("Loli", (s)->{
System.out.println(s);
});
// 消费方式:反转后输出
consume("Loli", (s)->{
String s2 = new StringBuilder(s).reverse().toString();
System.out.println(s2);
});
}
}
Consumer接口的andThen默认方法
将两个Consumer组合在一起
public class Demo02 {
public static void consume(String s, Consumer<String> con1, Consumer<String> con2) {
con1.andThen(con2).accept(s);
// 完全等价于
// con1.accept(s);
// con2.accept(s);
}
public static void main(String[] args) {
consume("loli", (s)->{
System.out.println(s.toUpperCase());
}, (s)->{
System.out.println(s.toLowerCase());
});
}
}
格式化输出数组(按照【姓名】和【年龄】)
public class Prac {
public static void printer(Consumer<String> con1, Consumer<String> con2, String[] arr){
for(String s : arr){
con1.andThen(con2).accept(s);
}
}
public static void main(String[] args) {
String[] arr = {"Alice,12", "Chino,10", "Cocoa,9"};
printer((s)->{
System.out.println("姓名:" + s.split(",")[0] + ";");
}, (s)->{
System.out.println("年龄:" + s.split(",")[1] + ".\n");
}, arr);
}
}
Predicate
import java.util.function.Predicate;
public class Demo01 {
public static boolean judge(String s, Predicate<String> pre){
return pre.test(s);
}
public static void main(String[] args) {
boolean bool = judge("loli", (s)-> s.length() > 5);
System.out.println(bool);
}
}
三个方法:与、或、非
public class Demo02 {
// 逻辑表达式
public static boolean judge1(String s, Predicate<String> pre1, Predicate<String> pre2) {
return pre1.and(pre2).test(s);
// 完全等价于return pre1.test(s) && pre2.test(s);
}
public static boolean judge2(String s, Predicate<String> pre1, Predicate<String> pre2){
return pre1.or(pre2).test(s);
// 完全等价于return pre1.test(s) || pre2.test(s);
}
public static boolean judge3(String s, Predicate<String> pre){
return pre.negate().test(s);
// return ! pre.test(s);
}
public static void main(String[] args) {
boolean bool1 = judge1("loli", (s) -> s.length() > 3, (s) -> s.contains("a"));
boolean bool2 = judge2("loli", (s) -> s.length() > 3, (s) -> s.contains("a"));
boolean bool3 = judge3("loli", (s) -> s.length() > 3);
}
}
数组筛选功能(【名字】长度等于5,【年龄】大于等于10)
public class Prac {
public static String[] filter(String[] arr, Predicate<String> pre1, Predicate<String> pre2) {
list<String> list = new ArrayList<>();
for (String s : arr) {
if (pre1.and(pre2).test(s)) {
list.add(s);
}
}
return list.toArray(new String[list.size()]);
}
public static void main(String[] args) {
String[] arr = {"Alice,12", "Chino,10", "Cocoa,9"};
String[] res = filter(arr, (s) -> s.split(",")[0].length() == 5, (s) -> Integer.valueOf(s.split(",")[1]) >= 10);
System.out.println(Arrays.toString(res));
}
}
Function 类型转换
一种数据类型转换为另一种数据类型
import java.util.function.Function;
public class Demo {
public static int trans(String s, Function<String, Integer> fun){
return fun.apply(s);
}
public static void main(String[] args) {
int n = trans("233", (s)->Integer.parseInt(s));
System.out.println(n);
}
}
andThen方法
public class Demo02 {
// 将字符串转化成整形后+10,再转化回字符串
public static String trans(String s, Function<String, Integer> fun1, Function<Integer, String> fun2) {
return fun1.andThen(fun2).apply(s);
}
public static void main(String[] args) {
String str = trans("12", (s) -> Integer.valueOf(s) + 10, (n) -> String.valueOf(n));
System.out.println(str);
}
}
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。


