常用的函数式接口

1. Supplier接口

生产性接口,指定接口中的泛型为是什么类型,那么接口中的get方法就会产生什么类型的数据。

例1:输出字符串

 1 package cn.itcast.day_13;
 2 
 3 import java.util.function.Supplier;
 4 
 5 public class DemoSupplier {
 6     public static String getString(Supplier<String> sup){
 7         return sup.get();
 8     }
 9 
10     public static void main(String[] args) {
11         String s = getString(() -> {
12             //生产一个字符串并返回
13             return "aaaa";
14         });
15         System.out.println(s);
16     }
17 }

例2:求数组中最大的数

 1 package cn.itcast.day_13;
 2 
 3 import java.util.function.Supplier;
 4 
 5 public class DemoSupplier02 {
 6     public static int getMax(Supplier<Integer> sup){
 7         return sup.get();
 8     }
 9 
10     public static void main(String[] args) {
11         int[] arr = {3, 1, 4, 7, 2, 8};
12         //调用getMax方法
13         int maxvalue = getMax(() -> {
14             int max = arr[0];
15             for (int i = 0; i < arr.length; i++) {
16                 if (max < arr[i]){
17                     max = arr[i];
18                 }
19             }
20             return max;
21         });
22 
23         System.out.println("最大值是" + maxvalue);
24     }
25 }

2. Consumer接口

例1:对字符串进行反转

 1 package cn.itcast.day_13;
 2 
 3 import java.util.function.Consumer;
 4 
 5 public class DemoConsumer {
 6 
 7     public static void method(String name, Consumer<String> con){
 8         con.accept(name);
 9     }
10 
11     public static void main(String[] args) {
12         method("abc",(String name)->{
13             //对传递的字符串进行消费
14             //1.直接输出
15             System.out.println(name);
16 
17             //2.字符串反转
18             String rename = new StringBuffer(name).reverse().toString();
19             System.out.println(rename);
20         });
21     }
22 }

Consum接口中的andThen方法:

(1)传入两个Consumer接口实现大小写转换:

 1 package cn.itcast.day_13;
 2 
 3 import java.util.function.Consumer;
 4 
 5 public class DemoandThen {
 6     public static void method(String s, Consumer<String> con1, Consumer<String> con2){
 7         con1.accept(s);
 8         con2.accept(s);
 9     }
10 
11     public static void main(String[] args) {
12         method("hello", (String s)->{
13             System.out.println(s.toUpperCase());
14         }, (String s)->{
15             System.out.println(s.toLowerCase());
16         });
17     }
18 }

(2)使用andThen方法实现大小写转换

 1 package cn.itcast.day_13;
 2 
 3 import java.util.function.Consumer;
 4 
 5 public class DemoandThen {
 6     public static void method(String s, Consumer<String> con1, Consumer<String> con2){
 7         //先对con1进行消费,再对con2进行消费
 8         con1.andThen(con2).accept(s);
 9     }
10 
11     public static void main(String[] args) {
12         method("hello", (String s)->{
13             System.out.println(s.toUpperCase());
14         }, (String s)->{
15             System.out.println(s.toLowerCase());
16         });
17     }
18 }

 使用andThen方法实现格式化输入

 1 package cn.itcast.day_13;
 2 
 3 import java.util.function.Consumer;
 4 
 5 public class DemoConsumer02 {
 6     public static void method(String[] arr, Consumer<String> con1, Consumer<String> con2){
 7         for (String message : arr){
 8             //使用andThen方法连接
 9             con1.andThen(con2).accept(message);
10         }
11     }
12 
13     public static void main(String[] args) {
14         String[] arr = {"张三,男", "李四,女", "王五,男"};
15         method(arr, (message)->{
16             //消费方式
17             String name = message.split(",")[0];
18             System.out.print("姓名:"+name);
19             System.out.print("---");
20         }, (message)->{
21             String xingbie = message.split(",")[1];
22             System.out.print("性别:"+xingbie+"\n");
23         });
24     }
25 }

3. Predicate接口

用于对某种数据进行判断,返回一个boolean类型

例:判断一个字符串长度是否大于5

 1 package cn.itcast.day_14;
 2 
 3 import java.util.function.Predicate;
 4 
 5 public class PredicateDemo {
 6     public static boolean checkString(String s, Predicate<String> pre){
 7         return pre.test(s);
 8     }
 9 
10     public static void main(String[] args) {
11         String s = "abcdef";
12         boolean b = checkString(s, (String str) -> {
13             //对参数传递的字符串进行判断,判断长度是否大于5
14             return str.length() > 5;
15         });
16 
17         System.out.println(b);
18     }
19 }

predicate中的三个默认方法

(1)and方法:

例1:判断字符串长度是否大于5包含a

 1 package cn.itcast.day_14;
 2 
 3 import java.util.function.Predicate;
 4 
 5 public class PredicateDemo02 {
 6     public static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2){
 7         return pre1.and(pre2).test(s);
 8     }
 9 
10     public static void main(String[] args) {
11         String s = "abcdef";
12         boolean b = checkString(s, (String str) -> {
13              return str.length() > 5;
14         }, (String str) -> {
15             return  str.contains("a");
16         });
17         System.out.println(b);
18     }
19 }

(2)or方法:

例2:判断字符串长度是否大于5包含a

 1 package cn.itcast.day_14;
 2 
 3 import java.util.function.Predicate;
 4 
 5 public class PredicateDemo03 {
 6     public static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2){
 7         return pre1.or(pre2).test(s);
 8     }
 9 
10     public static void main(String[] args) {
11         String s = "abcdef";
12         boolean b = checkString(s, (String str) -> {
13             return str.length() > 5;
14         }, (String str) -> {
15             return str.contains("a");
16         });
17         System.out.println(b);
18     }
19 }

 (3)!:

例3:判断字符串长度不大于5

 1 package cn.itcast.day_14;
 2 
 3 import java.util.function.Predicate;
 4 
 5 public class PredicateDemo04 {
 6     public static boolean checkString(String s, Predicate<String> pre){
 7         return !pre.test(s);
 8     }
 9 
10     public static void main(String[] args) {
11         String s = "abcdef";
12         boolean b = checkString(s, (String str) -> {
13             return str.length() > 5;
14         });
15         System.out.println(b);
16     }
17 }

例4:过滤数据

 1 package cn.itcast.day_14;
 2 
 3 import java.util.ArrayList;
 4 import java.util.function.Predicate;
 5 import java.util.zip.ZipEntry;
 6 
 7 public class PredicateDemo05 {
 8     public static ArrayList<String> filter(String[] arr, Predicate<String> pre1, Predicate<String> pre2){
 9         //定义一个Arrarlist集合
10         ArrayList<String> list = new ArrayList<>();
11         //获取数组中的每一条信息
12         for (String s : list){
13             boolean b = pre1.and(pre2).test(s);
14             if (b){
15                 list.add(s);
16             }
17         }
18         return list;
19     }
20 
21     public static void main(String[] args) {
22         String[] arr = {"张三,男","李四,女","王五,男","赵六,女"};
23         ArrayList<String> list = filter(arr, (String str) -> {
24             //获取字符串中性别,判断是否为女
25             return str.split(",")[1].equals("女");
26         }, (String str) -> {
27             return str.split(",")[0].length() == 4;
28         });
29 
30         for (String s : list){
31             System.out.println(s);
32         }
33     }
34 }

4. Function接口

例1:实现字符串转换为数字

 1 package cn.itcast.day_14;
 2 
 3 import java.util.function.Function;
 4 
 5 public class FunctionDemo {
 6     public static void change(String s, Function<String,Integer> fun){
 7         Integer in = fun.apply(s);
 8         System.out.println(in);
 9     }
10 
11     public static void main(String[] args) {
12         String s = "1234";
13         change(s, (String str)->{
14             return Integer.parseInt(str);
15         });
16     }
17 }

Function接口中的andThen方法

例2:将字符串转为数字,加10后再转换为字符串

 1 package cn.itcast.day_14;
 2 
 3 import java.util.function.Function;
 4 
 5 public class FunctionDemo02 {
 7     public static void change(String s, Function<String,Integer> fun1, Function<Integer,String> fun2){
 8         String s1 = fun1.andThen(fun2).apply(s);
 9         System.out.println(s1);
10     }
11 
12     public static void main(String[] args) {
13         String s = "123";
14         change(s, (String str)->{
15             //将字符转换为整数
16             return Integer.parseInt(str) + 10;
17         },(Integer in)->{
18             //数字转换为字符串
19             return in+"";
20         });
21     }
22 }

例3:

 

posted @ 2020-05-30 18:03  不溶解的糖  阅读(247)  评论(0编辑  收藏  举报