【Java工具类】Java8之Lambda表达式

2023-05-16

大千世界,茫茫人海,相识就是一种缘分。若此篇文章对您有帮助,点个赞或点个关注呗!

一、Lambda简述

1.1、Lambda概述

Lambda 表达式可以理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。

  • 匿名:它不像普通方法那样有一个明确的名称;
  • 函数:Lambda 表达式是函数是因为它不像方法那样属于某个特定的类,但和方法一样,Lambda 有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表;
  • 传递:Lambda 表达式可以作为参数传递给方法或存储在变量中;
  • 简洁:无需像匿名类那样写很多模板代码;

So That:

  • lambada 表达式实质上是一个匿名方法,但该方法并非独立执行,而是用于实现由函数式接口定义的唯一抽象方法
  • 使用 lambda 表达式时,会创建实现了函数式接口的一个匿名类实例
  • 可以将 lambda 表达式视为一个对象,可以将其作为参数传递

1.2、Lambda简介

Lambda 表达式是一个匿名函数(对于 Java 而言并不很准确,但这里我们不纠结这个问题)。简单来说,这是一种没有声明的方法,即没有访问修饰符,返回值声明和名称

Java 中的 Lambda 表达式通常使用语法是 (argument) -> (body):

(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }

Lambda 表达式举例:

(int a, int b) -> {  return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> 42
() -> { return 3.1415 };

1.3、Lambda表达式组成与结构

1.3.1、Lambda表达式组成

Lambda 表达式由参数列表、箭头和 Lambda 主体组成。

(Apple o1, Apple o2) -> Integer.valueOf(o1.getWeight()).compareTo(Integer.valueOf(o2.getWeight()))
  1. 参数列表:这里采用了 Comparator 中 compareTo 方法的参数;
  2. 箭头:箭头把参数列表和 Lambda 主体分开;
  3. Lambda 主体:表达式就是 Lambda 的返回值;
1.3.2、Lambda表达式结构

1)Lambda 表达式的结构

  • Lambda 表达式可以具有零个,一个或多个参数。
  • 可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型。例如 (int a) 与刚才相同 (a)
  • 参数用小括号括起来,用逗号分隔。例如 (a, b)(int a, int b)(String a, int b, float c)
  • 空括号用于表示一组空的参数。例如 () -> 42
  • 当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。例如 a -> return a*a
  • Lambda 表达式的正文可以包含零条,一条或多条语句。
  • 如果 Lambda 表达式的正文只有一条语句,则大括号可不用写,且表达式的返回值类型要与匿名函数的返回类型相同。
  • 如果 Lambda 表达式的正文有一条以上的语句必须包含在大括号(代码块)中,且表达式的返回值类型要与匿名函数的返回类型相同。

2)有效Lambda 表达式举例

Lambda 表达式含义
(String s) -> s.length()表达式具有一个 String 类型的参数并返回一个 int。 Lambda 没有 return 语句,因为已经隐含的 return,可以显示调用 return。
(Apple a) -> a.getWeight() > 150表达式有一个 Apple 类型的参数并返回一个 boolean 值
(int x, int y) -> { System.out.printn("Result"); System.out.printn(x + y)}表达式具有两个 int 类型的参数而没有返回值(void返回),Lambda 表达式可以包含多行语句,但必须要使用大括号包起来。
() -> 42表达式没有参数,返回一个 int 类型的值。
(Apple o1, Apple o2) -> Integer.valueOf(o1.getWeight()) .compareTo (Integer.valueOf(o2.getWeight()))表达式具有两个 Apple 类型的参数,返回一个 int 比较重要。

3)Lambda 表达式的使用举例

使用案例Lambda 示例
布尔表达式(List<String> list) -> list.isEmpty()
创建对象() -> new Apple(10)
消费对象(Apple a) -> { System.out.println(a.getWeight) }
从一个对象中选择/抽取(String s) -> s.lenght()
组合两个值(int a, int b) -> a * b
比较两个对象`(Apple o1, Apple o2) ->
Integer.valueOf(o1.getWeight())
.compareTo(Integer.valueOf(o2.getWeight()))

二、使用Lambda表达式

2.1、函数式接口

函数式接口就是只定义一个抽象方法的接口,比如 Java API 中的 Predicate、Comparator 和 Runnable 等。

public interface Predicate<T> {
    boolean test(T t);
}
public interface Comparator<T> {
    int compare(T o1, T o2);
}
public interface Runnable {
    void run();
}

函数式接口作用是什么?

Lambda 表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个具体实现 的实例)。你用匿名内部类也可以完成同样的事情,只不过比较笨拙:需要提供一个实现,然后 再直接内联将它实例化。

下面的代码是有效的,因为Runnable是一个只定义了一个抽象方法run 的函数式接口:

//使用Lambda
Runnable r1 = () -> System.out.println("Hello World 1");

//匿名类
Runnable r2 = new Runnable(){
public void run(){
System.out.println(“Hello World 2”);
}
};

public static void process(Runnable r){
r.run();
}

process(r1); //打印 “Hello World 1”
process(r2); //打印 “Hello World 2”
//利用直接传递的 Lambda 打印 “Hello World 3”
process(() -> System.out.println(“Hello World 3”));

2.2、通过示例感受Lambda

1)之前做法

Comparator<Apple> byWeight = new Comparator<Apple>() {
public int compare(Apple a1, Apple a2){
return a1.getWeight().compareTo(a2.getWeight());
}
};

2)现在做法

Comparator<Apple> byWeight =
(Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight());

2.3、Lambda语法规则

Lambda表达式有三个部分:

1) 参数列表

这里它采用了Comparator中compare方法的参数,两个Apple。

2)箭头

箭头->把参数列表与Lambda主体分隔开。

3)Lambda主体

比较两个Apple的重量。表达式就是Lambda的返回值了。

为了进一步说明,下面给出了Java 8中五个有效的Lambda表达式的例子。

| --------------------- | ------------------------------------------------------------ |

| 创建对象 | () -> new Apple(10) |

| 消费一个对象 | (Apple a) -> { System.out.println(a.getWeight()); } |

| 从一个对象中选择/抽取 | (String s) -> s.length() |

| 组合两个值 | (int a, int b) -> a * b |

| 比较两个对象 | (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()) |

三、Functional接口(函数式接口)

3.1、概述

"函数式接口"是指仅仅只包含一个抽象方法的接口,每一个函数式接口类型的lambda表达式都自动被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。

我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,为了确保你的接口确实是达到这个要求的,可以接口上添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。

注意:

lambda表达式无法访问接口的默认方法,lambda表达式只能去匹配对应接口中的唯一抽象方法。

相当于lambda表达式只是对抽象方法的实现,并没有创建接口的实现类对象,因为我们只是想使用这个抽象方法的实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Java工具类】Java8之Lambda表达式 的相关文章

  • 【Java】Collections集合类介绍

    Collections集合类介绍 Collections 是一个操作Set List和Map等集合的工具类 xff0c 提供了一系列静态方法对集合元素进行排序 查询和修改等操作 1 排序操作 xff08 1 xff09 reverse Li
  • AD将元器件由正面,放置到反面/元器件由反面放到正面

    按住选中元器件 xff0c 选中元器件之外的部分变灰 xff0c 选中元器件变成高亮 再按英文按键 l xff0c 实现元器件的正反面放置
  • CentOS6 yum命令报错YumRepo Error: All mirror URLs are not using ftp, http[s] or file解决

    原文地址 xff1a https www cnblogs com pistachio123 p 14301949 html 一 CentOS6 yum命令报错YumRepo Error All mirror URLs are not usi
  • Ubuntu 系统直接使用 root 用户登录实例

    Ubuntu 系统直接使用 root 用户登录实例 一般安装的Ubuntu 系统默认的不设置 root 帐户和密码 xff0c 这是为了安全做考虑 但是如果是本地虚拟机或者是作为测试使用 xff0c 直接使用root账户登录能减少很多麻烦
  • 深入浅出: 理解云原生基本原则

    云原生指的是一个敏捷的工程团队 xff0c 遵循敏捷的研发原则 xff0c 使用高度自动化的研发工具 xff0c 开发基于云基础设施和服务的应用以满足快速变化的客户需求 这些应用采用弹性 xff0c 可扩展和高可用的架构 这个工程团队通过高
  • java实现html转pdf

    1 需求 xff1a 将一个html页面转成pdf格式 2 方法 xff1a 在实现之前先考虑一个问题 xff0c pdf是前端生成还是后端生成 这里采用pdfbox 43 itext xff08 PDF文件名可自定义 xff09 技术在服
  • 生产者消费者模型(代码实现)

    一个场所 xff1a 队列 两个角色 xff1a 生产者 消费者 三种关系 xff1a 生产者 生产者 xff1a 互斥 消费者 消费者 xff1a 互斥 生产者 消费者 xff1a 同步 43 互斥 如果生产者直接将数据交给消费 xff0
  • XmlDocument操作XML

    https www cnblogs com fengxuehuanlin p 5631664 html C XmlDocument操作XML XML xff1a Extensible Markup Language xff08 可扩展标记语
  • Spring框架配置

    创建Maven项目 点击 Finish 按钮修改项目的Maven配置 在Maven仓库里查找Spring框架 xff0c 查看Spring Core xff0c 选择最新的版本 5 3 20 xff0c 添加到pom xml文件的 lt d
  • 在线古诗自动生成器的设计与实现

    在线古诗自动生成器的设计与实现 前言一 算法模型介绍LSTM简介模型框架实验环境实验与分析实验数据集数据集预处理训练过程模型训练结果模型的评估 二 在线古诗生成器的设计与实现系统结构远程服务器的项目部署系统测试 三 成品展示 前言 古诗 x
  • E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

    安装软件报错 apt get install python minimal E Unable to fetch some archives maybe run apt get update or try with fix missing 原
  • YUM命令常见报错以及解决办法

    简介 xff1a 本文主要为大家讲解CentOS 7系统中执行yum命令失败等常见问题的排查方法 1 执行yum命令报404错误 1 xff09 检查yum仓库是否配置正确 xff0c 可以到CentOS 镜像下载阿里云repo配置文件 2
  • 无法显示此网页

    上网过程中电脑打开浏览器 xff0c 浏览器突然显示 34 无法显示此网页 34 有可能是网络出现问题了 xff0c 也有可能是浏览器设置原因 xff0c 也有可能网站服务器原因 先用排除法来判断是哪种原因造成的 xff0c 再一一解决 0
  • 电脑添加打印机方法/步骤

    方法1 主要有以下几种方法 xff1a 1 新购买的打印机都会有自带的驱动软件安装光盘 xff0c 如果你电脑上有光驱的话 xff0c 直接安装上就可以了 xff1b 如果没有光驱那就到所购买的打印机品牌官网上去找对应型号的驱动下载安装上
  • ssh常见命令

    Linux系统的远程管理工具大概有几种 xff1a telnet xff0c ssh xff0c vnc等 xff0c 其中ssh是最常用的管理方法 xff0c 采用密文的传输方式 xff0c 简单安全 基本用法 最简单的用法就是不带参数
  • 芯片春秋: 开源架构RISC-V前世今生

    不久前 xff0c 特斯拉加入 RISC V基金会 xff0c 并考虑在新款芯片中使用免费的 RISC V 设计 至此 xff0c 已有IBM NXP 西部数据 英伟达 高通 三星 谷歌 华为等100多家科技公司加入RISC V阵营 出现这
  • 华为设备配置——配置通过FTP进行文件操作

    1 实验原理 FTP xff08 File Transfer Protocol xff0c 文件传输协议 xff09 是 TCP IP 协议组中的协议之一 其主要功能是向用户提供本地和远程主机之间的文件传输 xff0c FTP采用C S x
  • Linux学习笔记

    Linux linux的本质是一切皆目录 学习来自哔哩哔哩狂神说 xff0c 视频地址https www bilibili com video BV187411y7hF hostnamectl xff1a 查看linux信息 关机 shut
  • Linux .deb包的安装(gdebi)

    一些废话 deb包可以通过传统的dpkg命令来实现 xff0c 但过程中经常会遇到一些问题 所以有个软件叫GDebi xff0c 可以更加有效的帮助安装deb 通过点击deb包即可实现安装 xff0c 当然 xff0c 也可以通过命令行模式
  • 简单的理解EKF算法1

    简单的理解EKF算法 经典的EKF公式简化版的EKF公式参考资料 经典的EKF公式 来我们先来看一下第一眼看上去不知道在讲啥的公式 1 x k 61 A

随机推荐