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); } }
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。