首页 > 编程知识 正文

什么叫函数接口定义,函数式接口作用

时间:2023-05-06 11:18:23 阅读:233674 作者:2453

一、函数式接口定义 有且仅有一个抽象方法的接口 二、@FunctionalInterface 放在接口定义的上方,表示该接口是函数式接口接口有且仅有一个抽象方法 2.1、注意 定义函数式接口的时候,@FunctionalInterface是可选的,就算不写这个注解,只要保证满足函数式接口定义的条件,也照样是函数式接口。 三、实战 3.1、函数式接口作为方法的参数

public class Demo1 {public static void main(String[] args) {System.out.println("-----函数式接口作为方法的参数----");method((String s) -> {System.out.println(s);});}public static void method(Toshow toshow) {toshow.toSee("jadxlc");}interface Toshow {void toSee(String userName);}} 3.1、函数式接口作为方法的返回值

public class Demo2 {public static void main(String[] args) {Toshow method = method();method.toSee("小苗");}public static Toshow method() {// // 匿名内部类实现// return new Toshow() {// @Override// public void toSee(String userName) {// System.out.println(userName);// }// };return (String s) -> {System.out.println(s);};}interface Toshow {void toSee(String userName);}} 四、常用的函数式接口 Supplier接口Consumer接口Predicate接口Function接口 4.1、Supplier

包含一个无参的方法

T get​():获得结果该方法不需要参数,它会按照某种实现逻辑(由Lambda表达式实现)返回一个数据

Supplier接口也被称为生产型接口,如果我们指定了接口的泛型是什么类型,那么接口中的get方法就会生产什么类型的数据供我们使用。

4.1.1、案例1

public class Demo3 {public static void main(String[] args) {String s = getString(() -> {return "小苗";});System.out.println(s);System.out.println("---------------");Integer i = getInteger(() -> 30);System.out.println(i);}//定义一个方法,返回一个整数数据private static Integer getInteger(Supplier<Integer> sup) {return sup.get();}//定义一个方法,返回一个字符串数据private static String getString(Supplier<String> sup) {return sup.get();}} 4.1.2、案例2

用于返回一个int数组中的最大值public class Demo5 {public static void main(String[] args) {// 定义一个int数组int[] arr = { 19, 50, 28, 37, 46 };int maxValue = getMax(() -> {int max = arr[0];for (int i = 1; i < arr.length; i++) {if (arr[i] > max) {max = arr[i];}}return max;});System.out.println(maxValue);}// 返回一个int数组中的最大值private static int getMax(Supplier<Integer> sup) {return sup.get();}} 4.2、Consumer

包含两个方法

void accept​(T t):对给定的参数执行此操作default Consumer andThen​(Consumer after):返回一个组合的Consumer,依次执行此操作,然后执行 after操作。这个要看源码才能理解。

被称为消费型接口,它消费的数据类型由泛型指定。

4.2.1、案例

public class Demo3 {public static void main(String[] args) {operatorString("ABC", (String s) -> {System.out.println(s.toLowerCase());});System.out.println("-----------");operatorString("ABC", (String s) -> {System.out.println(s + "转小写:" + s.toLowerCase());}, (String s) -> {System.out.println("倒序:" + new StringBuilder(s).reverse().toString());});}// 定义一个方法,用不同的方式消费同一个字符串数据两次private static void operatorString(String name, Consumer<String> con1, Consumer<String> con2) {// con1.accept(name);// con2.accept(name);con1.andThen(con2).accept(name);}// 定义一个方法,消费一个字符串数据private static void operatorString(String name, Consumer<String> con) {con.accept(name);}} 4.2.2、案例2 1. String[] strArray = {"林青霞,30", "张曼玉,35", "王祖贤,33"};2. 字符串数组中有多条信息,请按照格式:"姓名:XX,年龄:XX"的格式将信息打印出来要求:把打印姓名的动作作为第一个Consumer接口的Lambda实例把打印年龄的动作作为第二个Consumer接口的Lambda实例将两个Consumer接口按照顺序组合到一起使用

public class Demo4 {public static void main(String[] args) {String[] strArray = { "林青霞,30", "张曼玉,35", "王祖贤,33" };printInfo(strArray,(String str) -> {String name = str.split(",")[0];System.out.print("姓名:" + name);},(String str) -> {int age = Integer.parseInt(str.split(",")[1]);System.out.println(",年龄:" + age);});}private static void printInfo(String[] strArray, Consumer<String> con1, Consumer<String> con2) {for (String str : strArray) {con1.andThen(con2).accept(str);}}} 4.3、Predicate

Predicate接口通常用于判断参数是否满足指定的条件

常用方法如下

1. boolean test​(T t):对给定的参数进行判断(判断逻辑由Lambda表达式实现),返回一个布尔值 2. default Predicate<T> negate​():返回一个逻辑的否定,对应逻辑非( !) 3. default Predicate<T> and​(Predicate other):返回一个组合判断,对应短路与(&&) 4. default Predicate<T> or​(Predicate other):返回一个组合判断,对应短路或(||) 4.3.1、案例1

public class Demo1 {public static void main(String[] args) {boolean b1 = checkString("A", (String s) -> {return s.equals("A");});System.out.println("b1:" + b1);boolean b2 = checkString("B", (String s) -> {return s.equals("A");});System.out.println("b2:" + b2);}// 逻辑非操作private static boolean checkString(String s, Predicate<String> pre) {// return pre.test(s);// return !pre.test(s);return pre.negate().test(s);}} 4.3.1、案例2

public class Demo2 {public static void main(String[] args) {boolean b1 = checkString2("A", (String s) -> {return s.equals("A");}, (String s) -> {return s.equals("B");});System.out.println("b1:" + b1);boolean b2 = checkString3("A", (String s) -> {return s.equals("A");}, (String s) -> {return s.equals("B");});System.out.println("b2:" + b2);}// 逻辑与运算private static boolean checkString2(String s, Predicate<String> pre1, Predicate<String> pre2) {return pre1.and(pre2).test(s);}// 逻辑或运算private static boolean checkString3(String s, Predicate<String> pre1, Predicate<String> pre2) {return pre1.or(pre2).test(s);}} 4.3.1、案例3 1. String[] strArray = {"林青霞,30", "柳岩,34", "张曼玉,35", "貂蝉,31", "王祖贤,33"};2. 字符串数组中有多条信息,请通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中,并遍历ArrayList集合3. 要求:同时满足如下要求 1:姓名长度大于2 2:年龄大于334. 分析: 1:有两个判断条件,所以需要使用两个Predicate接口,对条件进行判断 2:必须同时满足两个条件,所以可以使用and方法连接两个判断条件

public class Demo3 {public static void main(String[] args) {String[] strArray = { "林青霞,30", "柳岩,34", "张曼玉,35", "貂蝉,31", "王祖贤,33" };ArrayList<String> array = myFilter(strArray,s -> s.split(",")[0].length() > 2,s -> Integer.parseInt(s.split(",")[1]) > 33);for (String str : array) {System.out.println(str);}}// 通过Predicate接口的拼装将符合要求的字符串筛选到集合ArrayList中private static ArrayList<String> myFilter(String[] strArray, Predicate<String> pre1, Predicate<String> pre2) {// 定义一个集合ArrayList<String> array = new ArrayList<>();// 遍历数组for (String str : strArray) {if (pre1.and(pre2).test(str)) {array.add(str);}}return array;}} 4.4、Function<T,R> Function<T,R> 接口通常用于对参数进行处理,转换,然后返回一个新的值。常用的两个方法 R apply​(T t): 将此函数应用于给定的参数 default Function andThen​(Function after): 返回一个组合函数,首先将该函数应用于输入,然后将after函数应用于结果 4.4.1、案例1

public class Demo4 {public static void main(String[] args) {System.out.println("--------把一个字符串转换int类型,在控制台输出----------");convert("100", s -> Integer.parseInt(s));System.out.println("--------把一个int类型的数据加上一个整数之后,转为字符串在控制台输出----------");convert(100, i -> String.valueOf(i + 566));System.out.println("--------把一个字符串转换int类型,把int类型的数据加上一个整数之后,转为字符串在控制台输出----------");convert("100", s -> Integer.parseInt(s), i -> String.valueOf(i + 566));}// 把一个字符串转换int类型,在控制台输出private static void convert(String s, Function<String, Integer> fun) {int i = fun.apply(s);System.out.println(i);}// 把一个int类型的数据加上一个整数之后,转为字符串在控制台输出private static void convert(int i, Function<Integer, String> fun) {String s = fun.apply(i);System.out.println(s);}// 把一个字符串转换int类型,把int类型的数据加上一个整数之后,转为字符串在控制台输出private static void convert(String s, Function<String, Integer> fun1, Function<Integer, String> fun2) {// Integer i = fun1.apply(s);// String ss = fun2.apply(i);// System.out.println(ss);String ss = fun1.andThen(fun2).apply(s);System.out.println(ss);}} 4.4.2、案例2 1. String s = "林青霞,30";2. 请按照我指定的要求进行操作: 1. 将字符串截取得到数字年龄部分 2. 将上一步的年龄字符串转换成为int类型的数据 3. 将上一步的int数据加70,得到一个int结果,在控制台输出3. 请通过Function接口来实现函数拼接

public class Demo5 {public static void main(String[] args) {String s = "林青霞,30";convert(s,(String ss) -> {return s.split(",")[1];},(String ss) -> {return Integer.parseInt(ss);},(Integer i) -> {return i + 70;});}private static void convert(String s, Function<String, String> fun1, Function<String, Integer> fun2,Function<Integer, Integer> fun3) {int i = fun1.andThen(fun2).andThen(fun3).apply(s);System.out.println(i);}}

代码地址
https://gitee.com/DanShenGuiZu/learnDemo/tree/mysql_mybaties_DB/jdk8-learn

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。