Java中Lambda表达式的简单介绍

目录

一、简介

二、组成部分

三、使用场景

四、优点与注意事项

五、函数式接口

六、方法引用

七、使用示例

一、简介

Lambda表达式是 Java 8 引入的新特性,提供了一种简洁明了的方式来表示匿名函数(没有声明的方法)。它使得函数式编程在Java中成为可能,大大简化了代码,提高了可读性和可维护性。

基本语法

(参数列表) -> 表达式
或
(参数列表) -> { 代码块 }
  • 参数列表:可以为空(())或包含一个或多个参数。
  • 箭头操作符->,将参数列表与方法体分隔开。
  • 方法体:可以是一个表达式或一段代码块。

二、组成部分

Lambda表达式由以下三个部分组成:

  1. 参数列表

    • 表示输入参数,可以有0个、1个或多个。
    • 如果有多个参数,用逗号分隔。
    • 类型声明可选:参数类型可以明确声明,也可以省略,由编译器根据上下文推断。
    • 如果只有一个参数,圆括号可以省略。

    示例:

    (int x, int y) -> x + y   // 类型声明
    (x, y) -> x + y           // 类型推断
    x -> x * x                // 单个参数,省略括号
    () -> System.out.println("Hello") // 无参数
    
  2. 箭头操作符 (->)

    • 将参数列表与方法体分隔开。
    • ->是Lambda表达式的核心语法符号。
  3. 方法体

    • 定义Lambda表达式要执行的功能,可以是:
      • 单个表达式(无需大括号,值会自动作为返回值)。
      • 代码块(用大括号包裹,需要显式使用return返回值)。
    • 方法体的形式决定大括号和返回关键字的使用规则:
      • 单表达式:省略大括号和return
      • 代码块:必须加大括号,返回值需显式return

    示例:

    (x, y) -> x + y           // 单表达式,返回x + y的值
    (x, y) -> { return x + y; } // 代码块,显式返回x + y的值
    () -> System.out.println("Hello World") // 无返回值
    

三、使用场景

1. 函数式接口

函数式接口是只包含一个抽象方法的接口,通常会在接口上使用@FunctionalInterface注解。Lambda表达式最常见的用途就是替代匿名内部类来实现函数式接口。

示例

@FunctionalInterface
interface MathOperation {
    int operation(int a, int b);
}

// 使用Lambda表达式
MathOperation addition = (a, b) -> a + b;
int result = addition.operation(5, 3); // 输出8

2. 结合集合框架

Lambda表达式与Java集合框架的Stream API紧密结合,方便进行集合数据的过滤、映射、归约等操作。

示例

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

// 过滤出以字母'C'开头的名字并打印
names.stream()
     .filter(name -> name.startsWith("C"))
     .forEach(System.out::println); // 输出 "Charlie"

四、优点与注意事项

优点:

  1. 代码简洁:消除了匿名内部类的冗长代码,使代码更加精炼。
  2. 可读性高:代码结构清晰,逻辑一目了然。
  3. 提高效率:支持并行流处理,充分利用多核CPU的优势。
  4. 灵活性强:与函数式接口、方法引用等特性结合,增强了代码的灵活性。

注意事项:

  1. 只能用于函数式接口:Lambda表达式需要一个目标类型,该类型必须是函数式接口。
  2. 变量作用域:Lambda表达式中使用的局部变量必须是final有效的final(即其值在初始化后未被修改)。
  3. 检查异常:Lambda表达式中如果抛出受检异常,必须在接口的抽象方法中声明该异常。
  4. 调试困难:Lambda表达式的堆栈信息可能不如传统代码直观,调试时需要注意。

五、函数式接口

Java 8在java.util.function包中提供了一系列通用的函数式接口,如:

  • Predicate<T>:接收一个参数,返回boolean值。

    Predicate<String> isEmpty = s -> s.isEmpty();
    System.out.println(isEmpty.test("")); // true
    System.out.println(isEmpty.test("Hello")); // false
    
  • Function<T, R>:接收一个参数,返回一个结果。

    Function<Integer, String> intToString = num -> "Number: " + num;
    System.out.println(intToString.apply(10)); // 输出 "Number: 10"
    
  • Consumer<T>:接收一个参数,无返回值。

    Consumer<String> printer = s -> System.out.println(s);
    printer.accept("Hello World!"); // 输出 "Hello World!"
    
  • Supplier<T>:不接收参数,返回一个结果。

    Supplier<Double> randomSupplier = () -> Math.random();
    System.out.println(randomSupplier.get()); // 输出一个随机数
    
  • BinaryOperator<T>:接收两个相同类型的参数,返回一个相同类型的结果。

    BinaryOperator<Integer> adder = (a, b) -> a + b;
    System.out.println(adder.apply(10, 20)); // 输出 30
    

六、方法引用

如果Lambda表达式仅调用一个已存在的方法,可以使用方法引用来替代,语法更加简洁。

语法

  • 对象的实例方法引用:instance::method
  • 类的静态方法引用:Class::staticMethod
  • 类的实例方法引用:Class::instanceMethod

示例

public class LambdaClassSuper {
    LambdaInterface sf(){
        return null;
    }
}

public class LambdaClass extends LambdaClassSuper {
    public static LambdaInterface staticF() {
        return null;
    }

    public LambdaInterface f() {
        return null;
    }

    void show() {
        //1.调用静态函数,返回类型必须是functional-interface
        LambdaInterface t = LambdaClass::staticF;

        //2.实例方法调用
        LambdaClass lambdaClass = new LambdaClass();
        LambdaInterface lambdaInterface = lambdaClass::f;

        //3.超类上的方法调用
        LambdaInterface superf = super::sf;

        //4. 构造方法调用
        LambdaInterface tt = LambdaClassSuper::new;
    }
}

七、使用示例

实现线程:

// 传统方式
new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Thread is running");
    }
}).start();

// 使用Lambda表达式
new Thread(() -> System.out.println("Thread is running")).start();

列表排序:

List<Integer> strings = Arrays.asList(1, 2, 3);
//传统方式
Collections.sort(strings, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
    return o1 - o2;}
});

//Lambda
Collections.sort(strings, (Integer o1, Integer o2) -> o1 - o2);
//分解开
Comparator<Integer> comparator = (Integer o1, Integer o2) -> o1 - o2;
Collections.sort(strings, comparator);

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS实现实现当文本内容过长时,中间显示省略号...,两端正常展示

HTML 结构解析 文档结构: <ul class"con">: 一个无序列表&#xff0c;包含多个列表项。 每个 <li class"wrap"> 表示一个列表项&#xff0c;内部有两个 <span> 元素&#xff1a; <span class"txt">: 显示文本内容。<…

ROS VRRP软路由双线组网方式

虚拟路由冗余协议 Virtual Router Redundancy Protocol (VRRP)&#xff0c;MikroTik RouteROS VRRP 协议遵循 RFC 2338。 VRRP 协议是保证访问一些资源不会中断&#xff0c;即通过多台路由器组成一个网关集合&#xff0c;如果其中一台路由器出现故障&#xff0c;会自动启用另外…

设计编程网站集:简述可扩展性系统设计(笔记)

视频连接&#xff1a;简述可扩展性系统设计 三个关键原则 无状态 松散耦合 异步处理 扩展 负载均衡 缓存 分片

openCV与eigen两种方法---旋转向量转旋转矩阵

#include <Eigen/Dense> #include <opencv2/core/eigen.hpp> #include <opencv2/opencv.hpp> using namespace cv; using namespace std; int main() {// opencv 旋转向量cv::Vec3d rvec(1.0, 2.0, 3.0);cv::Mat rotation_matrix;cv::Rodrigues(rvec, rotati…

卷积运算和卷积定理

卷积运算 卷积运算是信号处理、图像处理和深度学习中的核心概念&#xff0c;用于表示两个函数之间的相互作用。它将一个函数通过滑动窗口的方式与另一个函数结合&#xff0c;产生一个新的函数&#xff0c;反映两者的重叠程度。 1. 定义 连续信号的卷积&#xff1a; 给定两个连…

【板间连接器焊接】

一、背景 近期工作需要,用到了AX7Z020核心板(黑金),官网链接:https://www.alinx.com/detail/271。 板子打好之后,遇到了焊接问题。对自身焊接技术还是比较自信的,直接上去焊接了2个连接器。拖锡搞了3小时后,放弃了。热风枪1分钟不到就把连接器吹下来了,看引脚90%都是…

低代码开发平台搭建思考与实战

什么是低代码开发平台&#xff1f; 低代码开发平台是一种平台软件&#xff0c;人们能通过它提供的图形化配置功能&#xff0c;快速配置出满足各种特定业务需求的功能软件。 具有以下特点&#xff1a; 提供可视化界面进行程序开发0代码或少量代码快速生成应用 什么是低代码产…

React Native 基础

React 的核心概念 定义函数式组件 import组件 要定义一个Cat组件,第一步要使用 import 语句来引入React以及React Native的 Text 组件: import React from react; import { Text } from react-native; 定义函数作为组件 const CatApp = () => {}; 渲染Text组件

ftdi_sio应用学习笔记 3 - GPIO

目录 1. 查找gpiochip 2. 打开GPIO 2.1 libgpiod库方式 2.2 系统方式 3. 关闭GPIO 3.1 libgpiod库方式 3.2 系统方式 4. 设置方向 4.1 libgpiod库方式 4.2 系统方式 5. 设置GPIO电平 5.1 libgpiod库方式 5.2 系统方式 6. 读取GPIO电平 6.1 libgpiod库方式 6.2 …

微信小程序登录注册页面设计(小程序项目)

需求 在微信小程序设计并实现登录页面&#xff0c;并填写相关登录注册函数 实现效果 代码实现 html代码 <view class"top" style"border-bottom-style: none;background-color:#FF8C69;"><!-- <view class"back" bind:tap"…

神经网络(系统性学习三):多层感知机(MLP)

相关文章&#xff1a; 神经网络中常用的激活函数 神经网络&#xff08;系统性学习一&#xff09;&#xff1a;入门篇 神经网络&#xff08;系统性学习二&#xff09;&#xff1a;单层神经网络&#xff08;感知机&#xff09; 多层感知机&#xff08;MLP&#xff09; 多层感…

Android 14 screenrecord录制视频失败的原因分析

文章目录 1. 权限问题2. 存储空间不足3. 命令被中断4. 目标路径问题5. Android 14 的新限制6. 文件系统同步问题7. 录制失败检查步骤总结&#xff1a; 在 Android 14 系统上&#xff0c;使用 screenrecord 命令录制视频后&#xff0c;生成的文件大小为 0&#xff0c;可能的原因…

Uniapp 简单配置鸿蒙

Uniapp 简单配置鸿蒙 前言下载并配置鸿蒙IDEHbuilder X 配置基本的信息生成相关证书登录官网获取证书IDE配置证书添加调试设备可能出现的问题前言 如今鸿蒙的盛起,作为多端开发的代表也是开始兼容鸿蒙应用的开发,接下来我将介绍如何在uniapp中配置鸿蒙。 注意:hbuilder X的…

git使用(一)

git使用&#xff08;一&#xff09; 为什么学习git?两种版本控制系统在github上创建一个仓库&#xff08;repository&#xff09;windows上配置git环境在Linux上配置git环境 为什么学习git? 代码写了好久不小心删了&#xff0c;可以使用git防止&#xff0c;每写一部分代码通…

C# 数据结构之【树】C#树

以二叉树为例进行演示。二叉树每个节点最多有两个子节点。 1. 新建二叉树节点模型 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace DataStructure {class TreeNode{public int Data { get;…

HarmonyOs鸿蒙开发实战(20)=>一文学会基础使用组件导航Navigation

敲黑板&#xff0c;以下是重点技巧。文章末尾有实战项目效果截图及代码截图可参考 1.概要 Navigation是路由导航的根视图容器Navigation组件主要包含​导航页&#xff08;NavBar&#xff09;和子页&#xff08;NavDestination&#xff09;&#xff0c;导航页不存在页面栈中&am…

python从入门到精通:pyspark实战分析

前言 spark&#xff1a;Apache Spark是用于大规模数据&#xff08;large-scala data&#xff09;处理的统一&#xff08;unified&#xff09;分析引擎。简单来说&#xff0c;Spark是一款分布式的计算框架&#xff0c;用于调度成本上千的服务器集群&#xff0c;计算TB、PB乃至E…

Ubuntu从入门到精通(二)远程和镜像源配置齐全

Ubuntu从入门到精通(二) 1 常见操作配置 1.1 英文语言配置 1.1.1 打开设置 1.1.2 设置语言为英文 1.1.3 重启生效 1.1.4 再次进入,选择更新名字 1.1.5 再次进入,发现已经变成了英文 1.2 输入法配置 1.3 rustdesk安装 1.3.1 Windows系统配置 登陆:https://github.com…

HTML5拖拽API学习 托拽排序和可托拽课程表

文章目录 前言拖拽API核心概念拖拽式使用流程例子注意事项综合例子&#x1f330; 可拖拽课程表拖拽排序 前言 前端拖拽功能让网页元素可以通过鼠标或触摸操作移动。HTML5 提供了标准的拖拽API&#xff0c;简化了拖放操作的实现。以下是拖拽API的基本使用指南&#xff1a; 拖拽…

华为Ensp模拟器配置OSPF路由协议

目录 简介 实验步骤 Pc配置 路由器配置 OSPF配置 交换机配置 简介 开放式最短路径优先 (OSPF) 协议深度解析 简介 开放式最短路径优先&#xff08;Open Shortest Path First, OSPF&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统…