• Java常用的函数式接口


    package com.fgy.demo3;
    
    import java.util.function.Supplier;
    
    /**
     * 函数式接口:Supplier
     * get方法返回和泛型相同类型的值
     */
    public class Demo01Supplier {
        public static void main(String[] args) {
            String s = getString(() -> "胡歌");
            System.out.println(s);
    
            int[] arr = {10, 11, 45, 12, 90};
            int maxValue = getMax(() -> {
                int max = arr[0];
                for (int i = 1; i < arr.length; i++) {
                    if (max < arr[i]) {
                        max = arr[i];
                    }
                }
                return max;
            });
            System.out.println(maxValue);
        }
    
        // 返回int类型的值
        private static int getMax(Supplier<Integer> sup) {
            return sup.get();
        }
    
        // 返回String类型的值
        private static String getString(Supplier<String> sup) {
            return sup.get();
        }
    }
    package com.fgy.demo3;
    
    import java.util.function.Consumer;
    
    /**
     * 函数式接口:Consumer
     * accept方法使用和泛型相同类型的值
     */
    public class Demo02Consumer {
        public static void main(String[] args) {
            method("胡歌", name -> {
                // System.out.println(name);
                // 反转字符串
                String reName = new StringBuilder(name).reverse().toString();
                System.out.println(reName);
            });
        }
    
        private static void method(String name, Consumer<String> con) {
            con.accept(name);
        }
    }
    package com.fgy.demo3;
    
    import java.util.function.Consumer;
    
    /**
     * 函数式接口:Consumer的默认方法andThen
     * 作用:需要两个Consumer接口,可以把两个Consumer接口组合到一起,再对数据进行消费
     */
    public class Demo03ConsumerAndThen {
        public static void main(String[] args) {
            method("Hello Word",
                    s -> System.out.println(s.toUpperCase()),
                    s -> System.out.println(s.toLowerCase())
            );
    
            String[] arr = {"赵丽颖,女", "胡歌,男", "李泌,女"};
            printInfo(arr,
                    s -> System.out.print("姓名:" + s.split(",")[0]),
                    s -> System.out.println(" 性别:" + s.split(",")[1])
            );
        }
    
        private static void method(String s, Consumer<String> con1, Consumer<String> con2) {
            // con1.accept(s);
            // con2.accept(s);
    
            con1.andThen(con2).accept(s); // HELLO WORD
                                          // hello word
            System.out.println("-----------");
            con2.andThen(con1).accept(s); // hello word
                                          // HELLO WORD
        }
    
        /**
         * 格式化信息输出
         */
        private static void printInfo(String[] arr, Consumer<String> con1, Consumer<String> con2){
            for (String s : arr) {
                con1.andThen(con2).accept(s);
            }
        }
    }
    package com.fgy.demo3;
    
    import java.util.function.Predicate;
    
    /**
     * 函数式接口:Predicate
     * Test(T t)用来对指定类型的数据进行判断,符合条件返回true,不符合返回false
     */
    public class Demo04Predicate {
        public static void main(String[] args) {
            boolean bool = checkString("abc", s -> s.length() >= 5);
            System.out.println(bool);
        }
    
        private static boolean checkString(String s, Predicate<String> pre) {
            return pre.test(s);
        }
    }
    package com.fgy.demo3;
    
    import java.util.function.Predicate;
    
    /**
     * 函数式接口:Predicate的默认方法and
     * 表示并且关系,用来连接两个判断条件,相当于&&运算符
     */
    public class Demo05PredicateAnd {
        public static void main(String[] args) {
            boolean bool = checkString("abc",
                    s -> s.length() >= 5,
                    s -> s.contains("a")
            );
            System.out.println(bool);
        }
    
        private static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2) {
            // return pre1.test(s) && pre2.test(s);
            return pre1.and(pre2).test(s);
        }
    }
    package com.fgy.demo3;
    
    import java.util.function.Predicate;
    
    /**
     * 函数式接口:Predicate的默认方法or
     * 表示或者关系,用来连接两个判断条件,相当于||运算符
     */
    public class Demo06PredicateOr {
        public static void main(String[] args) {
            boolean bool = checkString("ab",
                    s -> s.length() >= 5,
                    s -> s.contains("a")
            );
            System.out.println(bool);
        }
    
        private static boolean checkString(String s, Predicate<String> pre1, Predicate<String> pre2) {
            // return pre1.test(s) || pre2.test(s);
            return pre1.or(pre2).test(s);
        }
    }
    package com.fgy.demo3;
    
    import java.util.function.Predicate;
    
    /**
     * 函数式接口:Predicate的默认方法negate
     * 表示取反,相当!运算符
     */
    public class Demo07PredicateNegate {
        public static void main(String[] args) {
            boolean bool = checkString("abc", s -> s.length() >= 5);
            System.out.println(bool);
        }
    
        private static boolean checkString(String s, Predicate<String> pre) {
            // return !pre.test(s);
            return pre.negate().test(s);
        }
    }
    package com.fgy.demo3;
    
    import java.util.function.Function;
    
    /**
     * 函数式接口:Function
     * R apply(T t)根据类型T的参数获取类型R的结果
     */
    public class Demo08Function {
        public static void main(String[] args) {
            change("1234", s -> Integer.parseInt(s));
        }
    
        /**
         * Function<String, Integer>
         * 把String类型转换为Integer
         */
        private static void change(String s, Function<String, Integer> fun) {
            Integer in = fun.apply(s);
            System.out.println(in);
        }
    }
    package com.fgy.demo3;
    
    import java.util.function.Function;
    
    /**
     * 函数式接口:Function的默认方法andThen
     */
    public class Demo08FunctionAndThen {
        public static void main(String[] args) {
            change("10",
                    s -> Integer.parseInt(s) + 10,
                    i -> "String:" + String.valueOf(i)
            );
        }
    
        private static void change(String s, Function<String, Integer> fun1, Function<Integer, String> fun2) {
            // Integer in = fun1.apply(s) + 10; // 20
            // String ss = "String" + fun2.apply(in); // String:20
    
            String ss = fun1.andThen(fun2).apply(s);
            System.out.println(ss);
        }
    }
  • 相关阅读:
    10个令人惊奇的HTML5和JavaScript效果
    SQL Server 错误代码:17058 。解决方案
    [备忘]ASP.NET 惊爆新安全漏洞 攻击者可访问任意文件
    Senparc Google Sitemap(代号:SenMapic)网站地图生成器升级至v1.3
    Error 1 Project file must include the .NET Framework assembly 'PresentationCore, PresentationFramework' in the reference
    [备忘].NET Framework V2.0 Obsolete API List
    [备忘]在VirtualBox中收缩虚拟磁盘映像文件
    [备忘]修改SQL Server 2005/2008 用户数据库文件默认路径和默认备份路径
    [备忘]解决ManualResetEvent.WaitOne在Silverlight环境下将整个UI线程卡死,并无法继续调用异步子线程的问题
    [备忘]21个演示展示强大的jQuery特效
  • 原文地址:https://www.cnblogs.com/roadlandscape/p/12179723.html
Copyright © 2020-2023  润新知