首页 > 编程语言 >Java知识点整理 18 — Lambda表达式

Java知识点整理 18 — Lambda表达式

时间:2024-07-02 15:58:55浏览次数:3  
标签:知识点 Java int 18 接口 MyInterface return public Lambda

一. 简介

Lambda 表达式是函数式编程思想的体现,强调做什么,而不是以什么方式去做。

面向对象编程思想强调的是对象,必须通过对象的形式来做一些事情。比如多线程执行任务,需要创建对象,对象需要实现指定接口,然后再执行等。过程相对繁琐。而如果使用函数式编程思想,可以直接通过传递一段代码给线程对象执行,不需要创建任务对象。

Lambda 表达式可以被视为匿名函数,允许在需要函数的地方以更简洁的方式定义功能

因此只要是函数式接口,就可以使用 Lambda 表达式简化。

函数式接口指的是接口中有且只有一个未实现的方法。如果超过一个,则不是函数式接口;如果有一个默认实现方法,一个未实现的方法,也是函数式接口。

// 接口中有超过一个未实现方法,不是函数式接口
interface MyInterface {
    int sum(int a, int b);
    int min(int a, int b);
}

// 接口中只有一个未实现的方法,是函数式接口
interface MyCase{
    int hello();
    default int hello(int a){return a;} //默认实现
}

可以用 JDK 中提供的检查注解 @FunctionalInterface 来检查该接口是否为函数式接口。

正常情况下:

异常情况下:

 二. Lambda 表达式的格式

1. 标准格式

( 参数列表 )-> { 代码 }

2. 格式说明

小括号内是参数列表,语法与传统方法参数列表一致,没有参数就留空,有多个就用逗号分隔。

箭头符号 ->,代表指向动作。

大括号内是业务逻辑代码,语法与传统方法体一致。

3. 举例

创建线程

// 传统方式
Thread thread1 = new Thread(new Runnable() {
    @Override
    public void run () {
       System.out.println("线程需要执行的任务代码1");
    }
});
thread1.start();
 
// Lambda表达式
Thread t2 = new Thread(()->{
    System.out.println("线程需要执行的任务代码2");
});
t2.start();

比较器

List<Integer> list = new ArrayList<>();
Collections.addAll(list,11,22,33,44,55);
System.out.println("排序之前的集合:" + list);
        
// 传统方式
Collections.sort(list, new Comparator<Integer>() {
    @Override
    public int compare (Integer o1, Integer o2) {
        return o2-o1;
    }
});
 
// Lambda表达式
Collections.sort(list,(Integer o1, Integer o2)->{return o2-o1;});
System.out.println("排序之后的集合:" + list);

三. Lambda 表达式与函数式接口

假如有一个接口 MyInterface,里面有一个方法 sum(),

interface MyInterface {
    int sum(int a, int b);
}

想要实现这个接口,有两种方法:

1. 自己写实现类

class MyInterfaceImpl implements MyInterface {
    @Override
    public int sum(int a, int b) {
        return a + b;
    }
}

然后调用,

public class Lambda {
    public static void main(String[] args) {
        MyInterface myInterface = new MyInterfaceImpl();
        int result = myInterface.sum(1, 2);
        System.out.println(result);
    }
}

2. 创建匿名实现类

每个接口都去写对应的实现类相对麻烦,因此可以采用匿名实现类动态的去实现接口

public class Lambda {
    public static void main(String[] args) {

        // 1. 自己创建实现类对象
        MyInterface myInterface = new MyInterfaceImpl();
        int result = myInterface.sum(1, 2);
        System.out.println("自己创建的实现类对象 " + result);

        // 2. 创建匿名实现类
        MyInterface myInterface1 = new MyInterface() {
            @Override
            public int sum(int a, int b) {
                return a*a + b*b;
            }
        };
        int result1 = myInterface1.sum(1, 2);
        System.out.println("匿名实现类 " + result1);
    }
}

在匿名实现类中,很多格式上的东西都是固定的,因此可以进一步简化,只保留动态的东西,比如参数、方法体内容等,

// 2. 匿名实现类
MyInterface myInterface1 = new MyInterface() {
    @Override
    public int sum(int a, int b) {
       return a*a + b*b;
    }
};

// 3. Lambda表达式实现接口  参数列表 + 箭头 + 方法体
MyInterface myInterface2 = (int a, int b) -> {
    return a * a + b * b;
};

进一步思考,其实参数类型也是固定的,还可以再简化,

MyInterface myInterface3 = (x, y) -> {
     return x * x + y * y;
};

参数名不一定是接口中定义的(a,b),也可以是其它名字,比如(x,y)。

此外,参数部分如果为空,可以留空,即只写一个(),但不能不写括号;或者如果只有一个参数,可以只写一个参数名,

// 入参为控
interface MyCase1{
    int hello();
}

public class Lambda {
    public static void main(String[] args) {
        MyCase myCase1 = () -> {
            return 1;
        };
    }
}

// 只有一个参数 a
interface MyCase2{
    int hello(int a);
}

public class Lambda {
    public static void main(String[] args) {
        MyCase1 myCase2 = a -> {
            return a + 1;
        };
    }
}

方法体如果只有一句话,{ } 和 return 可以省略,

interface MyCase2{
    int hello(int a);
}

public class Lambda {
    public static void main(String[] args) {
        MyCase1 myCase2  = a ->  a + 2;
        // 调用方法
        System.out.println(myCase2.hello(1));
    }
}

四. Lambda 表达式的表现形式 

1. 变量形式

变量的类型为函数式接口(不常用)

// 变量的形式
Runnable r = ()->{
    System.out.println("任务代码");
};
// 函数式接口类型的变量
Thread t = new Thread(r);

2. 参数形式

方法的形参类型为函数式接口(常用)

// 变量的形式-比较器
Comparator<Integer> comparable = (o1, o2)->{return o2 - o1;};

// 创建集合
ArrayList<Integer> list = new ArrayList<>();

// 存入数据
Collections.addAll(list,11,22,33,44,55);
 
// 将函数式接口类型的形参类型,传给Collections
Collections.sort(list,comparable);

3. 返回值形式

方法的返回值类型为函数式接口(常用)

// 定义一个方法
public static Comparator<Integer> getComparator(){
     return (Integer o1,Integer o2)->{return  o2-o1;};
}
        
public static void main (String[] args) {
   // 返回值形式
   Collections.sort(list,getComparator());
}

标签:知识点,Java,int,18,接口,MyInterface,return,public,Lambda
From: https://blog.csdn.net/konghaoran1/article/details/140124540

相关文章

  • Java JVM——11. 执行引擎
    1.概述执行引擎属于JVM的下层,里面包括:解释器、即时编译器、垃圾回收器。执行引擎是Java虚拟机核心的组成部分之一。“虚拟机”是一个相对于“物理机”的概念,这两种机器都有代码执行能力,其区别是物理机的执行引擎是直接建立在处理器、缓存、指令集和操作系统层面上的,而......
  • java实现微信登录
    前言上一篇做了php的微信登录,所以也总结一下Java的微信授权登录并获取用户信息这个功能的开发流程。配置配置什么的就不多说了,详细的配置可以直接前往我上一篇查看。https://www.cnblogs.com/nothavebug/p/18277732流程实现(后端)(JAVA)(springboot)1.首先先配置一下applica......
  • 为啥说现在是升级到 Java 21最佳时机
    背景:基于NewRelic的年度“StateoftheJavaEcosystem”调查结果。对许多Java开发者仍在使用低版本Java感到沮丧。Java21的优势:SpringBoot3.x需要至少Java17,而Java21在技术上比Java8更优越,包括速度、安全性、易用性、性能和内存效率。Java21的道德优越性:使用......
  • 2023-2025年最值得选择的Java毕业设计选题大全:1000个热门选题推荐✅✅✅
    ......
  • JavaScript 学习教程:从入门到精通
    JavaScript学习教程:从入门到精通JavaScript是网页开发过程中不可或缺的一部分,无论你是初学者还是有一定基础的开发者,这篇教程将帮助你更深入地理解和运用JavaScript。本文将分为多个章节,涵盖JavaScript的基本概念、高级技术、常用库和框架,以及实际项目案例。目录Jav......
  • 开发一套java语言的智能导诊需要什么技术?java+ springboot+ mysql+ IDEA互联网智能3D
    开发一套java语言的智能导诊需要什么技术?java+springboot+mysql+IDEA互联网智能3D导诊系统源码医院导诊系统是一种基于互联网和3D人体的智能化服务系统,旨在为患者提供精准、便捷的医院就诊咨询服务。该系统整合了医院的各种医疗服务资;智慧导诊解决患者盲目就诊问题,减轻分......
  • Java基础语法
    注释单行注释//文字多行注释/*文字*/文档注释/**​*​*​*/标识符关键字(不能用以下关键字来起名字,会报错)Java所有的组成部分都需要名字。类名、变量名以及方法名都被称为标识符。标识符注意点所有的标识符都应该以字母(A-Z或者a-z)、美元符号($)、或者下划......
  • Java线程池的实现原理及其在业务中的最佳实践
    一、线程池简介1.什么是线程池?线程池是一种用于管理和复用线程的机制。线程池的核心思想是预先创建一定数量的线程,并把它们保存在线程池中,当有任务需要执行时,线程池会从空闲线程中取出一个线程来执行该任务。任务执行完毕后,线程不是被销毁,而是返还给线程池,可以立即或稍后被......
  • 【JavaScript脚本宇宙】打造完美用户体验:六大模态库全解析
    从美观到高效:六大模态库实战指南前言随着现代Web开发的不断进步和用户体验要求的提升,模态窗口(Modal)已成为网页设计中不可或缺的一部分。模态窗提供了一种直观而有效的方式来展示重要信息、提示用户操作或承载交互内容。本文将全面介绍六大流行的模态库,包括BootstrapModal......
  • 基于java+vue+ssm+jsp保险业务管理系统设计与实现毕业设计实战源码+lw等全套资料
    前言......