java复习第10天---10.1---Java8新特性---函数式接口

java复习第10天---10.1---函数式接口

目录




内容

1、概述

  有且仅有一个抽象方法的接口,称为函数式接口。
&emps; 函数式接口,既适用于函数式编程场景的接口。而Java中的函数式编程思想体现为Lambda,所有函数式接口适用于Lambda使用的接口。只有确保接口中有且仅有1个抽象方法,Java中的Lambda才能顺利地进行推导。

  • 语法糖:使用更加方便,但是原理不变的代码语法。例如集合变量中的for-each 和迭代器

  • 格式

      @FunctionalInterface
      修饰符 interface 接口名 {
      	public abstract 返回值类型 方法名(参数列表);
      }
    
  • 解析:

    • @FunctionalInterface:用于检测该接口是否为一个函数式接口

2、使用

  使用函数式接口有三种形式:

  • 创建函数式接口的实现类对象

  • 内明内部类

  • Lambda表达式

  • 示例2-1:

      package feature.jdk8.functionalinterface;
    
      @FunctionalInterface
      public interface MyFunctionalInterface {
      	void method();
      }
      
      package feature.jdk8.functionalinterface;
    
      public class MyFunctionalInterfaceImpl implements MyFunctionalInterface{
    
      	@Override
      	public void method() {
      		System.out.println("函数式接口实现类实现抽象方法");		
      	}
    
      }
      
      package feature.jdk8.functionalinterface;
    
      public class TestFunctionalInterface1 {
      	public static void main(String[] args) {
      		// 1、实现类
      		show(new MyFunctionalInterfaceImpl());
      		// 2、匿名内部类
      		show(new MyFunctionalInterface() {
    
      			@Override
      			public void method() {
      				System.out.println("匿名内部类实现函数式接口抽象方法");						
      			}
    
      		});
      		// 3、Lambda表达式
      		show(() -> System.out.println("Lambda表达式实现函数式接口抽象方法"));
      	}
    
      	public static void show(MyFunctionalInterface mf) {
      		mf.method();
      	}
      }
      测试结果:
      函数式接口实现类实现抽象方法
      匿名内部类实现函数式接口抽象方法
      Lambda表达式实现函数式接口抽象方法
    

3、Lambda表达式优化

3.1、Lambda的延迟执行

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

3.2、性能浪费的日志案例(简单)

  下面为按级别不同输出不同的日志信息。

  • 代码3.2-1:

      package feature.jdk8.lambda;
    
      public class TestLambdaLog1 {
      	public static void main(String[] args) {
      		String msg1 = "Hello";
      		String msg2 = " World";
      		String msg3 = " Java";
      		log(1, msg1 + msg2 + msg3);
      		log(2, msg1 + msg2 + msg3);
      	}
      	// 根据日志级别不同,显示不同信息
      	public static void log(int level, String msg) {
      		if(level == 1) {
      			System.out.println(msg);
      		}
      	}
      }
    
  • 问题分析:无论级别是否满足需求,作为log方法第二个参数,三个字符串都会执行拼接,传入方法内,然后进行级别判断。如果级别不符合要求,那么字符串拼接操作白做了,造成性能浪费。

3.3、Lambda表达式优化

  使用Lambda表达式优化上面的日志案例:

  • Lambda特点:延迟加载

  • 使用前提:函数式接口

  • 函数式接口代码3.3-1:功能实现消息拼接

      package feature.jdk8.lambda;
    
      @FunctionalInterface
      public interface MessageBuilder{
      	String builder(); // 拼接信息
      }
      
      package feature.jdk8.lambda;
    
      public class TestLambdaLog2 {
      	public static void main(String[] args) {
      		String msg1 = "Hello";
      		String msg2 = " World";
      		String msg3 = " Java";
      		log(1, () -> msg1 + msg2 + msg3);
      	}
      	// 根据日志级别不同,显示不同信息
      	public static void log(int level, MessageBuilder mb) {
      		if(level == 1) {
      			System.out.println(mb.builder());
      		}
      	}
    
      }
    
  • 解析:

    • 使用Lambda表达式传递参数,仅仅吧参数传递到log方法中
    • 只有满足条件,日志等级是1级
      • 才会调用接口的builder方法进行字符串的拼接
    • 如果条件不满足,接口的builder方法不会执行,自然不会进行字符串的拼接

后记

本项目为参考某马视频开发,相关视频及配套资料可自行度娘或者联系本人。上面为自己编写的开发文档,持续更新。欢迎交流,本人QQ:806797785

前端项目源代码地址:https://gitee.com/gaogzhen/vue-leyou
后端JAVA源代码地址:https://gitee.com/gaogzhen/JAVA
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gaog2zh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值