• Java 基础复习 Day 24


    Java 基础复习 Day 24

    常见函数式接口 (1)

    1. 函数式接口:

      • 定义:在java中,函数式接口指的是在接口中有且只有一个抽象方法

      • 应用:在java中的体现就是lambda表达式(Lambda表达式就是匿名内部类的“语法糖”,但更简单的形式)

      • 格式:

        修饰符 interface 接口名{

        ​ [public] [abstract] 修饰符 方法名(参数列表);

        ​ //其他非抽象方法内容

        }

      • @FunctionalInterface注解,来确保和检查这个接口是函数式接口

        @FunctionalInterface
        public interface DemoFuncInterface {
            void method1();
        }
        
        • 1
        • 2
        • 3
        • 4
      • 应用场景:函数式接口作为方法的返回值或参数

      • 和一般接口比较多了一个lambda表达式来实现接口的抽象方法

        //上边函数式接口作为方法参数的应用
        public static void main(String[] args) {
            show(() -> {
                System.out.println("函数式接口的lambda实现方式");
            });
        }
        public static void show(DemoFuncInterface funcInterface){
            funcInterface.method1();
        }
        
        • 1
        • 2
        • 3
        • 4
        • 5
        • 6
        • 7
        • 8
        • 9
    2. 函数式编程

      2.1 Lambda的延迟执行(有些场景的代码执行后,结果不一定被使用,从而造成了一定的性能浪费,而lambda表达式是延迟执行的,正好可以作为解决方案而使性能进行提升)

      性能浪费的日志案例

      /*
      *日志案例:
      *
      * 发现以下代码存在性能浪费问题:
      * 发现 showLog方法前 是把第二个参数拼接后再去调用showLog方法,
      * 如果等级是1, 那么showLog前的message拼接就是无用功
      * */
      public class demo01Logger {
          //定义一个根据日志的级别去显示日志信息的方法
          public static void showLog(int level, String mesg){
              //对日志等级进行判断
              if (level == 1) {
                  System.out.println(mesg);
              }
          }
          public static void main(String[] args) {
              String msg1 = "Hello";
              String msg2 = "World";
              String msg3 = "Java";
              //调用日志显示方法,传递日志显示级别和信息
              showLog(1,msg1+msg2+msg3);
          }
      }
      //使用Lambda编程优化日志案例:
      //定义一个函数式接口,定义一个拼接字符串的抽象方法头
      @FunctionalInterface
      public abstract interface MessageBuilder {
          String buildMessage();
      }
      /*
      * 使用Lambda编程来简化和优化日志案例
      * Lambda特点:延迟加载
      * Lambda使用前提:存在函数式接口
      * */
      public class Demo02Lambda {
          public static void main(String[] args) {
              String msg1 = "Hello";
              String msg2 = "World";
              String msg3 = "Java";
              //调用日志显示方法,传递日志显示级别和信息
              showLog(1,() -> msg1+msg2+msg3);
              /*
              * 使用Lambda表达式时, 只有level是1时,才会调用接口buildMessage方法,
              * 此时才会进行字符串的拼接,
              * 如果条件不满足,level不是1时,buildMessage就不会执行,那么就不会执行字符串的拼接
              * 那么就不会存在性能的拼接
              * */
          }
          //定义一个根据日志的级别去显示日志信息的方法,参数有所变化,int的level和接口类型的创建好的message
          public static void showLog(int level, MessageBuilder mesg){
              //对日志等级进行判断
              if (level == 1) {
                  System.out.println(mesg.buildMessage());
              }
          }
      }
      
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23
      • 24
      • 25
      • 26
      • 27
      • 28
      • 29
      • 30
      • 31
      • 32
      • 33
      • 34
      • 35
      • 36
      • 37
      • 38
      • 39
      • 40
      • 41
      • 42
      • 43
      • 44
      • 45
      • 46
      • 47
      • 48
      • 49
      • 50
      • 51
      • 52
      • 53
      • 54
      • 55
      • 56
      • 57

    2.2 函数式接口作为返回值,JDK内置的函数式接口:comparator

    import java.util.Arrays;
    import java.util.Comparator;
    
    public class DemoComparator {
        public static Comparator<String> compareStrings1(){
            //方法的返回值是一个接口
            return new Comparator<String>() {
                @Override
                public int compare(String o1, String o2) {
                    return o2.length() - o1.length();//降序排列
                }
            };
        }
        public static Comparator<String> compareStrings2(){
            //方法的返回值是一个接口
            return (o1, o2) -> o2.length() - o1.length();
        }
    
        public static void main(String[] args) {
            String[] strings = {"aaa","b","cccc","dd","a"};
            System.out.println(Arrays.toString(strings));//[aaa, b, cccc, dd, a]
            Arrays.sort(strings,compareStrings2());
            System.out.println(Arrays.toString(strings));//[cccc, aaa, dd, b, a]
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
  • 相关阅读:
    分享一个JS对象隐式转换的问题
    List的使用
    论文阅读之《Kindling the Darkness: A Practical Low-light Image Enhancer》
    智慧城市新篇章:数字孪生的力量与未来
    ubuntu 与 windows 之间的文件互传
    (其他) 剑指 Offer 46. 把数字翻译成字符串 ——【Leetcode每日一题】
    03 【npm的使用】
    k8s--基础架构--容器运行时接口 (CRI)和垃圾回收
    【栈】224. 基本计算器
    C语言之字符串
  • 原文地址:https://blog.csdn.net/karenkou/article/details/126351767