Java 基础复习 Day 24

Java 基础复习 Day 24

常见函数式接口 (1)

  1. 函数式接口:

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

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

    • 格式:

      修饰符 interface 接口名{

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

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

      }

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

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

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

      //上边函数式接口作为方法参数的应用
      public static void main(String[] args) {
          show(() -> {
              System.out.println("函数式接口的lambda实现方式");
          });
      }
      public static void show(DemoFuncInterface funcInterface){
          funcInterface.method1();
      }
      
  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());
            }
        }
    }
    
    

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]
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值