java8特性,lambda表达式,简写的演变及应用

news2024/11/20 9:14:47

🍬博主介绍
👨‍🎓 博主主页:chad_chang的主页
✨主攻领域:【大数据】【java】【python】【面试分析】

文章目录

  • lambda表达式
    • 1.1.简介
      • 1.1.1.什么是Lambda?
      • 1.1.2.为什么使用Lambda
      • 1.1.3.Lambda对接口的要求
      • 1.1.4.@FunctionalInterface
    • 1.2.基本语法
      • 1.2.1.语法格式
      • 1.2.2.准备工作: 创建接口
      • 1.2.3.创建类Demo
    • 1.3语法精简
      • 1.3.1. lambda写法
      • 1.3.2. 参数类型精简
      • 1.3.3. 参数小括号精简
      • 1.3.4.方法大括号精简
      • 1.3.5.大括号精简补充
    • 1.4.语法进阶
      • 1.4.1.方法引用(静态方法和普通方法)
        • 1.4.1.1.why
        • 1.4.1.2.what
        • 1.4.1.3.how
          • 1.4.1.3.1.静态方法
          • 1.4.1.3.2.非静态普通方法

lambda表达式

1.1.简介

1.1.1.什么是Lambda?

Lambda是JAVA 8添加的新特性,说白了,Lambda是一个匿名函数

1.1.2.为什么使用Lambda

使用Lambda表达式可以对一个接口的方法进行非常简洁的实现

1.1.3.Lambda对接口的要求

虽然可以使用Lambda表达式对某些接口进行简单的实现,但是并不是所有的接口都可以用Lambda表达式来实现,要求接口中定义的必须要实现的抽象方法只能是一个
在JAVA8中 ,对接口加了一个新特性:default
可以使用default对接口方法进行修饰,被修饰的方法在接口中可以默认实现

1.1.4.@FunctionalInterface

修饰函数式接口的,接口中的抽象方法只有一个

1.2.基本语法

1.2.1.语法格式

(parameters) -> expression

(parameters) -> { statements; }
() 用来描述参数列表
{} 用来描述方法体 有时可以省略
-> lambda运算符

1.2.2.准备工作: 创建接口

/**
 * 无参数无返回值接口
 */
@FunctionalInterface
interface LambdaNoneReturnNoneParmeter {

    void test();
}

/**
 * 无返回值有单个参数
 */
@FunctionalInterface
interface LambdaNoneReturnSingleParmeter {

    void test(int n);
}

/**
 * 无返回值 多个参数的接口
 */
@FunctionalInterface
interface LambdaNoneReturnMutipleParmeter {

    void test(int a,int b);
}

/**
 * 有返回值 无参数接口
 */
@FunctionalInterface
interface LambdaSingleReturnNoneParmeter {

    int test();
}

/**
 * 有返回值 有单个参数的接口
 */
@FunctionalInterface
interface LambdaSingleReturnSingleParmeter {

    int test(int n);
}

/**
 * 有返回值 有多个参数的接口
 */
@FunctionalInterface
interface LambdaSingleReturnMutipleParmeter {

    int test(int a,int b);
}

1.2.3.创建类Demo

import org.junit.Test;

public class Demo {

    @Test
    public void test01() {

        LambdaSingleReturnMutipleParmeter lambda1 = new LambdaSingleReturnMutipleParmeter() {
            @Override
            public int test(int a, int b) {
                return a + b;
            }
        };

        int result = lambda1.test(1, 2);
        System.out.println(result);
    }
}

注意:运行,会出现以下错误
在这里插入图片描述
解决方法
修改工作空间
修改工作空间,路径为:.idea --> workspace.xml

找到标签 。在标签里加一行:

<property name="dynamic.classpath" value="true" />

如下图:
在这里插入图片描述
此刻可以顺利运行,但是这不是我们的重点;
重点是lambda的学习

1.3语法精简

1.3.1. lambda写法

在这里插入图片描述
在Demo类中继续写以下代码:

    @Test
    public void test02(){
        LambdaSingleReturnMutipleParmeter lambda2 = (int a, int b) -> {
                return a + b;
        };

        int result2 = lambda2.test(1, 2);
        System.out.println(result2);
    }
}

1.3.2. 参数类型精简

因为在接口的方法中, 已经定义类参数的类型, 所以在lambda表达式中参数的类型可以省略

    @Test
    public void test02(){
        LambdaSingleReturnMutipleParmeter lambda2 = (a, b) -> {
                return a + b;
        };

        int result2 = lambda2.test(1, 2);
        System.out.println(result2);
    }
}

1.3.3. 参数小括号精简

如果参数列表中, 参数的个数只有一个, 此时小括号可以省略;

    @Test
    public void test03(){
    //一个参数一个返回值
        LambdaSingleReturnSingleParmeter lambda3 = a -> {return 10;};

        int result3 = lambda3.test(1);
        System.out.println(result3);
    }

1.3.4.方法大括号精简

如果方法中只有一条语句, 此时大括号也可以省略

1.3.5.大括号精简补充

如果方法体中唯一的一条语句是一个返回结果语句,
则省略大括号的同时 也必须省略return关键字

    @Test
    public void test04(){
    //无参一个返回值
        LambdaSingleReturnNoneParmeter lambda4 =()  -> 10;

        int result4 = lambda4.test();
        System.out.println(result4);
    }

1.4.语法进阶

1.4.1.方法引用(静态方法和普通方法)

1.4.1.1.why

在实际应用过程中, 一个接口在很多地方都会调用同一个实现, 例如

LambdaSingleReturnMutipleParmeter lambda1 = (a, b) -> a + b;
LambdaSingleReturnMutipleParmeter lambdab = (a, b) -> a * b;

这样一来每次都要写上具体的实现方法, 如果需求变更, 则每一处都需要更改, 基于这种情况, 可以将后续的实现更改为自定义的方法, 需要时直接调用即可.

1.4.1.2.what

方法引用:
可以快速的将一个lambda表达式的实现指向一个已经实现的方法
方法的隶属者 如果是静态方法, 隶属者就是一个类, 其他的话都是隶属对象
语法: 方法的隶属者::方法名
注意:

1 引用的方法中, 参数的个数和类型一定要和接口中定义的方法一致
2 返回值的类型也一定要和接口中的方法一致

1.4.1.3.how

1.4.1.3.1.静态方法
package stream.lambda.cn.itcast.b;

public class Demo {
    public static void main(String[] args) {
        // 精简前
        LambdaSingleReturnMutipleParmeter lambda1 = (a, b) -> a + b;
        LambdaSingleReturnMutipleParmeter lambda2 = (a, b) -> a * b;

        // 精简后
        LambdaSingleReturnMutipleParmeter lambda3 = (a, b) -> MyStaticClass.add(a, b);
        LambdaSingleReturnMutipleParmeter lambda4 = MyStaticClass::multiplication;
    }


}

// 静态方法类
class MyStaticClass {
    public static int add(int x, int y) {
        return x + y;
    }

    public static int multiplication(int x, int y) {
        return x * y;
    }
}


/**
 * 有返回值 有多个参数的接口
 */
@FunctionalInterface
interface LambdaSingleReturnMutipleParmeter {

    int test(int a, int b);
}
1.4.1.3.2.非静态普通方法
package stream.lambda.cn.itcast.c;

public class Demo {
    public static void main(String[] args) {
        // 精简前
        LambdaSingleReturnMutipleParmeter lambda1 = (a, b) -> a + b;
        LambdaSingleReturnMutipleParmeter lambda2 = (a, b) -> a * b;

        // 精简后
        MyNotStaticClass myNotStaticClassObj = new MyNotStaticClass();
        LambdaSingleReturnMutipleParmeter lambda3 = (a, b) -> myNotStaticClassObj.add(a, b);
        LambdaSingleReturnMutipleParmeter lambda4 = myNotStaticClassObj::multiplication;
        int result3 = lambda3.test(10, 20);
        int result4 = lambda4.test(10, 20);
        System.out.println("result3 = " + result3);
        System.out.println("result4 = " + result4);
    }
}

// 自定义非静态类
class MyNotStaticClass {
    public int add(int x, int y) {
        return x + y;
    }

    public int multiplication(int x, int y) {
        return x * y;
    }
}

/**
 * 有返回值 有多个参数的接口
 */
@FunctionalInterface
interface LambdaSingleReturnMutipleParmeter {
    int test(int a, int b);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Linux】特别篇--SMBus 协议

【Linux】特别篇--SMBus 协议一、SMBus 简介二、SMBus 与 I2C 区别三、SMBus协议分析3.1 符号含义3.2 SMBus Quick Command3.3 SMBus Receive Byte3.4 SMBus Send Byte3.5 SMBus Read Byte3.6 SMBus Read Word3.7 SMBus Write Byte3.8 SMBus Write Word3.9 SMBus Block Read3.1…

672页21万字智慧高速数据中心大数据平台建设方案

目 录 第1章 设计总述 6 1.1 项目概述 6 1.1.1 项目名称 6 1.1.2 建设单位概况 6 1.1.3 公司具备的优势 6 1.2 对项目的理解分析 7 1.2.1 项目现状分析 7 1.2.2 建设目标分析 10 1.2.3 建设内容分析 13 1.2.4 项目建设重难点分析 19 1.2.5 项目风险分析 22 1.2.6 各中心职能需求…

python控制台颜色输出设置

python控制台颜色输出设置 控制台输出内容的颜色有前景色与背景色 控制台的展示效果有限&#xff0c;并不能像前端一样炫酷&#xff0c;只能做一些简单的设置 原理 python终端的字符颜色是用转义序列控制的&#xff0c;是文本模式下的系统显示功能&#xff0c;和具体的语言无…

【C++笔试强训】第十天

&#x1f387;C笔试强训 博客主页&#xff1a;一起去看日落吗分享博主的C刷题日常&#xff0c;大家一起学习博主的能力有限&#xff0c;出现错误希望大家不吝赐教分享给大家一句我很喜欢的话&#xff1a;夜色难免微凉&#xff0c;前方必有曙光 &#x1f31e;。 &#x1f4a6; &…

操作系统的地址、数据存储和大小端问题

文章目录基本概念什么是位&#xff0c;什么是字节&#xff1f;地址总线内存地址物理地址虚拟地址寻址空间存储单元CPU位数CPU寻址大端存储和小端存储原理为什么会有大小端模式的区分基本概念 什么是位&#xff0c;什么是字节&#xff1f; 位表示的是二进制位&#xff0c;一般…

C语言中用sizeof和strlen观察数组的变化2

目录 一.前言 二.用sizeof观察字符串数组的变化 代码 运行结果 结果解释 图解 三.用sizeof观察字符数组的变化 代码 注意 运行结果 图解 注意 证明 一.前言 数组名大部分情况下是首元素的地址&#xff0c;只有两种情况除外&#xff1a; sizeof&#xff08;数组名&…

哈希桶的基本操作 || HashMap和HashSet介绍(手撕源码)

目录 前言&#xff1a; 哈希表介绍 哈希冲突 闭散列 开散列&#xff08;哈希桶&#xff09; 模拟实现哈希桶中插入和获取方法 代码实现 HashMap介绍 手撕源码 HashSet介绍 手撕源码 小结&#xff1a; 前言&#xff1a; &#x1f388;一棵搜索树的最快查找数据的时间复杂度是O(…

Java------String类和正则表达式

String在设计时被定义成了final类&#xff08;最终类&#xff09;&#xff0c;所以不能定义String类的子类&#xff0c;String用来表示字符串常量&#xff0c;是引用数据类型&#xff0c;一旦String类对象的字符序列被定义&#xff0c;那么这个字符序列的值是不能再变化的。 创…

今年十八,喜欢SQL注入

#1024程序员节&#xff5c;用代码&#xff0c;改变世界# 前言 &#x1f340;作者简介&#xff1a;被吉师散养、喜欢前端、学过后端、练过CTF、玩过DOS、不喜欢java的不知名学生。 &#x1f341;个人主页&#xff1a;被吉师散养的职业混子 &#x1fad2;每日emo&#xff1a;怀揣…

牛客竞赛每日俩题 - Day5

DP贪心 年终奖_牛客题霸_牛客网 思路&#xff1a; 定义f(i,j)表示从左上角走到坐标(i&#xff0c;j)处能获得的最大奖励。 搜索所有从左上角走到右下角的路径&#xff0c;找到最优路径。 f(i,j)分三种情况&#xff1a; 第一列&#xff1a;f(i, 0) f(i-1, 0) board(i, 0) 如果…

Java:企业应该用Java构建供应链软件吗?

很多公司使用Java编程语言&#xff0c;Java是最流行的编程语言之一&#xff0c;它帮助开发人员简化复杂企业解决方案的应用程序开发过程。 供应链是零售和制造业的重要组成部分&#xff0c;6%的零售业公司使用Java&#xff0c;另一方面&#xff0c;4%的制造公司使用编程语言&am…

基于莱维飞行扰动策略的麻雀搜索算法-附代码

基于莱维飞行扰动策略的麻雀搜索算法 文章目录基于莱维飞行扰动策略的麻雀搜索算法1.麻雀优化算法2. 改进麻雀算法2.1 莱维飞行搜索机制2.2 莱维飞行扰动策略2.3 初始化混沌搜索机制3.实验结果4.参考文献5.Matlab代码6.Python代码摘要&#xff1a;为了解决麻雀搜索算法存在迭代…

(02)Cartographer源码无死角解析-(04) 熟悉bag文件,配置.launch与.lua文件,初步调参

本人讲解关于slam一系列文章汇总链接:史上最全slam从零开始&#xff0c;针对于本栏目讲解(02)Cartographer源码无死角解析-接如下: (02)Cartographer源码无死角解析- (00)目录_最新无死角讲解&#xff1a;https://blog.csdn.net/weixin_43013761/article/details/127350885 文…

算法 | 详解斐波那契数列问题

14天阅读挑战赛 本篇是学习了《趣学算法&#xff08;第2版&#xff09;》 第一章之后总结的。 上一篇讲到了等比数列求和问题&#xff0c;求Sn122223...263&#xff1f;S_n 1 2 2^2 2^3 ... 2^{63} &#xff1f;Sn​122223...263&#xff1f;&#xff0c;该函数属于爆…

1024,我们节日

文章目录1024的前奏1024应该锻炼身体1024 &#xff1f;为何是1024其他的1024代码有Bug&#xff0c;世界却温暖特殊的一类人群&#xff08;一&#xff09;特殊的一类人群&#xff08;二&#xff09;写在最后1024的前奏 写博文的时间是23号&#xff0c;距离1024这个标志性的节日…

趣学算法14天阅读|Day2

14天阅读挑战赛 文章目录前言什么是算法&#xff1f;算法复杂度如何评定好算法案例案例一&#xff1a;棋盘的麦子案例二&#xff1a;兔子数列总结前言 &#x1f4eb; 作者简介&#xff1a;「六月暴雪飞梨花」&#xff0c;专注于研究Java&#xff0c;就职于科技型公司后端中级工…

@AutoConfigurationPackage注解详解

AutoConfigurationPackage是在springboot启动类注解SpringBootApplication下的EnableAutoConfiguration下。AutoConfigurationPackage作用是指定springboot扫描包&#xff0c;默认就是扫描启动类同包下的类。可以通过AutoConfigurationPackage来附加其他路径&#xff0c;然后sp…

asp.net园林绿化服务交易网站

本设计的目的是通过对园林绿化的初步了解&#xff0c;在巩固网站设计所学知识的基础上。运用于实践&#xff0c;在实践中强化理论知识&#xff0c;做到理论联系实践。在设计中学会搜集资料地方法&#xff0c;学会查阅设计规程。掌握设计步骤&#xff0c;同时培养创新能力&#…

【图像评价】基于matlab GUI图像评价系统【含Matlab源码 2185期】

一、图像质量评价 图像质量评价对图像处理算法的可行性分析以及某类算法达成效果的比较都起着非常重要的指导作用。随着图像处理技术的发展&#xff0c;对于图像质量评价的研究也日益深入&#xff0c;新的评价指标和评价算法不断涌现&#xff0c;共同推动了图像质量评价的进步…

【模型训练】YOLOv7旋翼无人机检测

YOLOv7旋翼无人机检测 1、YOLOv7算法旋翼无人机检测模型训练2、YOLOv7模型模型评估3、模型和数据集下载1、本项目采用YOLOv7算法实现对空中旋翼无人机的检测,在一万多张旋翼无人机检测数据集中训练得到,我们训练了YOLOv7模型,经评估我们得出了各个模型的评价指标; 2、目标类…