IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Lambda表达式 | 浅解 -> 正文阅读

[Java知识库]Lambda表达式 | 浅解

Lambda表达式

简介

  • Lambda表达式支持将代码块作为方法参数,允许使用更简洁的代码来创建只有一个抽象方法的接口(被称为函数式接口)的实例。
  • 函数式接口:只含一个抽象方法的接口。
  • Lambda表达式就相当于一个匿名方法。
  • 作用:代替匿名内部类的繁琐语法。
  • 部分:形参列表(允许省略形参类型,圆括号);箭头 -> ;代码块(可以省略花括号,return)
  • Lambda表达式实际上会被当成一个任意类型的对象。
  • Lambda表达式本质是一个函数
(参数列表) -> {
	方法体;
};

简单的Lambda表达式

  • 用匿名内部类实现:
//函数式接口:只含一个抽象方法的接口
interface Cal{
     int add(int a, int b);
}

//这个是我们以前的实现,匿名内部类,然后调用执行;
public class Program {

    public static void main(String[] args) {
    	//匿名内部类
        Cal c1 = new Cal() {
        	//重写实现接口
            @Override
            public int add(int a, int b) {
                return a+b;
            }
        };
        
        //调用执行
        int c = c1.add(1, 2);
        System.out.println(c);
    }
    
}
  • 用Lambda表达式改写下:
//函数式接口:只含一个抽象方法的接口
interface Cal{
     int add(int a, int b);
}

//用Lambda表达式改写下:
public class Program {

    public static void main(String[] args) {
    	//Lambda表达式
        Cal c1=(int a,int b) ->{
        	return a+b;
        };
        
        //调用执行
        int c=c1.add(1,2);
        System.out.println(c);
    }
    
}

Lambda表达式语法

  • 搞一个案例,接口方法参数,无参,单个参数,两个参数,有返回值,没有返回值,这六种情况都罗列下:
public class Test {
    public static void main(String[] args) {
        
        I1 i1 = () -> {
            System.out.println("无返回值、无参数");
        };
        i1.test();//无返回值、无参数
         
         
        I2 i2 = (int a, int b) -> {
            System.out.println("无返回值,多个参数。a=" + a + ", b=" + b);
        };
        i2.test(2, 3);//无返回值,多个参数。a=2, b=3
        
        
        I3 i3 = () -> {
            System.out.println("有返回值、无参数");
            return 100;
        };
        System.out.println(i3.test());//有返回值、无参数  100
        
       
        I4 i4 = (int a, int b) -> {
            System.out.println("有返回值,多个参数。a=" + a + ",b=" + b);
            return a + b;
        };
        System.out.println(i6.test(2, 4));//有返回值,多个参数。a=2,b=4   6
    }
}


interface I1 {
	//无返回值、无参数
    void test();
}

interface I2 {
	//无返回值,多个参数
    void test(int a, int b);
}

interface I3 {
	//有返回值、无参数
    int test();
}

interface I4 {
	//有返回值,多个参数
    int test(int a, int b);
}

Lambda表达式精简语法

  1. 参数类型可以省略。

  2. 假如只有一个参数()括号可以省略。

  3. 如果方法体只有一条语句{}大括号可以省略。

  4. 如果方法体中唯一的语句是return返回语句,那省略大括号的同时return也可以省略

//省略前的
I6 i6=(int a, int b)->{
 	return a+b;
 };

// 省略:参数类型,{}大括号,return
I6 i6=(a,b)->a+b;

方法引用

  • 有时候多个lambda表达式实现函数是一样的话,我们可以封装成通用方法,以便于维护;
  • 这时候可以用方法引用实现:
    语法是:对象::方法(需new一个对象)
    若是static方法类名::方法(无需new一个对象,直接类名)
public class Program2 {

    public static void main(String[] args) {
        // 方法引用
        
        // 普通方法 对象名::方法名 (需new一个对象)
        Program2 program2 = new Program2();
        I5 i5 = program2::test;
        System.out.println(i5.test(1));

		// static方法 类名::方法名 (无需new一个对象,直接类名)
        I5 i52 = Program2::test2;
        System.out.println(i52.test(1));


    }

    public int test(int a){
        return a-2;
    }
	//static方法
    public static int test2(int a){
        return a-2;
    }

}

interface I5{
    //单个参数有返回值
    int test(int a);
}

构造方法引用

  • 如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现,那么就可以使用构造方法引用;
  • 语法:类名::new
public class Program3 {

    public static void main(String[] args) {

        // 普通方式
        DogService dogService = ()->{
            return new Dog();
        };
        dogService.getDog();

        // 简化方式
        DogService dogService2 = ()->new Dog();
        dogService2.getDog();

        // 构造方法引用
        DogService dogService3 = Dog::new;
        dogService3.getDog();

        // 构造方法引用 有参
        DogService2 dogService21 = Dog::new;
        dogService21.getDog("一二三",8);
    }
}

//在定义两个接口:
interface DogService{
    Dog getDog();
}
interface DogService2{
    Dog getDog(String name,int age);
}


//先定义一个Dog实体,实现无参和有参构造方法
class Dog {
    private String name;
    private int age;
    
    public Dog() {
        System.out.println("无参构造方法");
    }
    public Dog(String name, int age) {
        System.out.println("有参构造方法");
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Dog{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

@FunctionalInterface注解

  • 这个注解是函数式接口注解,所谓的函数式接口,当然首先是一个接口,然后就是在这个接口里面只能有一个抽象方法。
  • 接口有且仅有一个抽象方法
  • 该注解不是必须的,如果一个接口符合"函数式接口"定义,那么加不加该注解都没有影响。加上该注解能够更好地让编译器进行检查。如果编写的不是函数式接口,但是加上了@FunctionInterface,那么编译器会报错

系统内置函数式接口

  • Java8的推出,是以Lambda重要特性,一起推出的,其中系统内置了一系列函数式接口。
  • 再jdk的java.util.function包下,有一系列的内置函数式接口:比如常用的Consumer,Comparator,Predicate,Supplier等。

Lambda表达式与匿名内部类的联系和区别

  • Lambda表达式是匿名内部类的一种简化
  • 相同点:(1)都可以直接访问“effectively final”的局部变量,以及外部类的成员变量;(2)都可以直接调用从接口中继承的默认方法。
  • 区别:(1)匿名内部类可以为任何接口创建实例,Lambda表达式只能为函数式接口创建实例;(2)匿名内部类可以为抽象类甚至不同类创建实例;(3)匿名内部类允许调用接口中定义的默认方法。

使用Lambda表达式调用Arrays的类方法

  • Arrays类的有些方法需要Comparator、XXXOperator、XXXFunction等接口的实例,都是函数式接口,因此可以使用Lambda表达式来调用Arrays的类方法。

本文为视频课程的学习笔记,加自己一点总结。

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-06-16 21:31:54  更:2022-06-16 21:35:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 19:19:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码