Java Lambda语法介绍

news2024/12/25 9:20:20

目录

一、概述

二、Lambda语法的历史

2.1 Lambda名字的含义

2.2 Lambda的历史

三、Lambda语法的核心接口

3.1 Lambda的四大核心接口

3.1.1 概述

3.1.2 Consumer 接口

3.1.3 Supplier 接口

3.1.4 Function 接口,>

3.1.5 Predicate 接口

四、Lambda的引用

4.1 概述

4.2 方法的引用

4.2.1 对象::实例方法

4.2.2 类::静态方法

4.2.3 类::实例方法

4.3 构造器的引用

4.4 数组的引用

五、Lambda的使用场景

5.1 简化编程

5.2 函数式接口

5.3 事件处理

5.4 并行处理


一、概述

Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中),它允许我们以简洁、可读的方式表示匿名函数。通过Lambda表达式,我们可以将代码块作为参数传递给其他函数,从而实现更灵活的编程。

二、Lambda语法的历史

2.1 Lambda名字的含义

Lambda 这个名字 并不是一个什么的缩写,它是希腊第十一个字母 λ 的读音,同时它也是微积分函数中的一个概念,所表达的意思是一个函数入参和出参定义,在编程语言中其实是借用了数学中的 λ,并且多了一点含义,在编程语言中功能代表它具体功能的叫法是匿名函数(Anonymous Function),根据百科的解释:匿名函数在计算机编程中是指一类无需定义标识符(函数名)的函数或子程序。

2.2 Lambda的历史

说起Lambda 的历史,虽然它在 JDK8 发布之后才正式出现,但是在编程语言界,它是一个具有悠久历史的东西,最早在 1958 年在Lisp 语言中首先采用,而且虽然Java脱胎于C++,但是C++在2011年已经发布Lambda 了,但是 JDK8 的 LTS 在2014年才发布,现代编程语言则是全部一出生就自带 Lambda 支持。

三、Lambda语法的核心接口

3.1 Lambda的四大核心接口

3.1.1 概述

Java8为了我们方便编程,就为我们提供了四大核心函数式接口,分别是Consumer<T> : 消费型接口、Supplier<T> : 供给型接口、Function<T, R> : 函数型接口、Predicate<T> : 断言型接口,具体如下图所示:

3.1.2 Consumer<T> 接口

代码例子:

package main.java.com.ningzhaosheng.lambada.demo;

import java.util.function.Consumer;

/**
 * @author ningzhaosheng
 * @date 2024/6/27 17:57:21
 * @description Consumer接口 测试例子
 */
public class TestConsumer {

    public static void main(String[] args) {
        task(66.66,(m) -> System.out.println("本次一共花费"+m+ "元!!!"));
    }

    public static void task(double money, Consumer<Double> consumer){
         consumer.accept(money);
    }
}

3.1.3 Supplier<T> 接口

代码例子:

package main.java.com.ningzhaosheng.lambada.demo;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Supplier;

/**
 * @author ningzhaosheng
 * @date 2024/6/27 18:03:18
 * @description Supplier 接口测试例子
 */
public class TestSupplier {

    public static void main(String[] args) {
        List<Integer> list = getNumList(10, () -> (int) (Math.random() * 100));
        for (Integer num : list) {
            System.out.println("随机数:" + num);
        }
    }

    public static List<Integer> getNumList(int num, Supplier<Integer> supplier) {
        List<Integer> list = new ArrayList<Integer>();
        for (int i = 0; i < num; i++) {
            Integer n = supplier.get();
            list.add(n);
        }
        return list;
    }
}

3.1.4 Function<T, R> 接口

代码例子:

package main.java.com.ningzhaosheng.lambada.demo;

import java.util.function.Function;

/**
 * @author ningzhaosheng
 * @date 2024/6/27 18:10:01
 * @description Function 接口测试例子
 */
public class TestFunction {

    public static void main(String[] args) {
        String trimStr = stringHandler("\t\t\t hello,你好啊,升哥!",(str)->str.trim());
        System.out.println("字符串去掉空格==========="+trimStr);

        String newStr = stringHandler("桃子姑娘是一个很漂亮的姑娘,我们青梅竹马,两小无猜,我很喜欢桃子姑娘!",(str)->str.substring(26));
        System.out.println("截取字符串==========="+newStr);
    }

    public static String stringHandler(String str, Function<String,String> function){
         return function.apply(str);
    }
}

3.1.5 Predicate<T> 接口

代码例子:

package main.java.com.ningzhaosheng.lambada.demo;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

/**
 * @author ningzhaosheng
 * @date 2024/6/27 18:21:37
 * @description Predicate 接口测试例子
 */
public class TestPredicate {

    public static void main(String[] args) {
        List<String> list = Arrays.asList("Hello", "你好啊,升哥", "HashMap", "Python", "JDK8", "Map", "List", "Set", "Collection");
        List<String> stringList = filterStr(list, (str) -> str.length() > 5);
        for (String string : stringList) {
            System.out.println("打印满足条件的字符串=========" + string);
        }
    }

    public static List<String> filterStr(List<String> strings, Predicate<String> predicate) {
        List<String> stringList = new ArrayList<String>();
        for (String str : strings) {
            if (predicate.test(str))
                stringList.add(str);
        }
        return stringList;
    }
}

四、Lambda的引用

4.1 概述

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用! 方法引用:使用操作符 “ :: ” 将方法名和对象或类的名字分隔开来。

如下三种主要使用情况 :

  • 对象 :: 实例方法
  • 类 :: 静态方法
  • 类 :: 实例方法

可以将方法引用理解为 Lambda 表达式的另外一种表现形式,方法引用所引用的方法的参数列表与返回值类型,需要与函数式接口中抽象方法的参数列表和返回值类型保持一致!

4.2 方法的引用

4.2.1 对象::实例方法

代码例子一:

package main.java.com.ningzhaosheng.lambada.demo1.method;

import java.io.PrintStream;
import java.util.function.Consumer;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:03:20
 * @description 测试对象::实例方法引用
 */
public class TestObjectAndInstanceMethod {
    public static void main(String[] args) {
        Consumer<String> con1 = (str)->System.out.println(str);
        con1.accept("Hello World!");
        PrintStream ps = System.out;
        Consumer<String> con2 = ps::println;
        con2.accept("Hello Java8!");
        Consumer<String> con3 = System.out::println;
        con3.accept("Hello Lambada!");
    }
}

代码例子二:

package main.java.com.ningzhaosheng.lambada.demo1.method;

import main.java.com.ningzhaosheng.lambada.demo1.Employee;

import java.util.function.Supplier;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:13:54
 * @description 测试对象::实例方法引用
 */
public class TestObjectAndInstanceMethod1 {

    public static void main(String[] args) {
        Employee em = new Employee();
        em.setAge(20);
        em.setName("张三");
        Supplier<? extends String> supplier = ()->em.getName();
        String str =  supplier.get();
        System.out.println(str);
        Supplier<Integer> supplier1 = em::getAge;
        Integer age = supplier1.get();
        System.out.println(age);
    }
}

4.2.2 类::静态方法

代码例子:

package main.java.com.ningzhaosheng.lambada.demo1.method;

import java.util.Comparator;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:28:20
 * @description 测试类::静态方法引用
 */
public class TestClassAndStaticMethod {
    public static void main(String[] args) {
        Comparator<Integer> comparator = (x,y)->Integer.compare(x,y);
        System.out.println(comparator.compare(10,20));

        Comparator<Integer> comparator1 = Integer::compare;
        System.out.println(comparator1.compare(100,300));
    }
}

4.2.3 类::实例方法

代码例子:

package main.java.com.ningzhaosheng.lambada.demo1.method;

import java.util.function.BiPredicate;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:34:11
 * @description 测试类::实例方法引用
 */
public class TestClassAndInstanceMethod {
    public static void main(String[] args) {
        BiPredicate<String,String> bp1 = (str1,str2)->str1.equals(str2);
        System.out.println(bp1.test("Hello","hello"));

        BiPredicate<String,String> bp2 = String::equals;
        System.out.println(bp2.test("Java","Java"));
    }
}

4.3 构造器的引用

代码例子:

package main.java.com.ningzhaosheng.lambada.demo1.construct;

import main.java.com.ningzhaosheng.lambada.demo1.Employee;

import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Supplier;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:44:03
 * @description 测试构造器引用
 */
public class TestConstruct {
    public static void main(String[] args) {
        // 无参构造
        Supplier<Employee> supplier = () -> new Employee();
        System.out.println(supplier.get());

        // 无参构造
        Supplier<Employee> supplier1 = Employee::new;
        System.out.println(supplier1.get());

        // 一个参数构造
        Function<Integer, Employee> function = Employee::new;
        Employee employee = function.apply(1001);
        System.out.println(employee.toString());

        // 两个参数构造
        BiFunction<Integer, String, Employee> biFunction = Employee::new;
        Employee employee1 = biFunction.apply(1001, "张三");
        System.out.println(employee1.toString());
    }

}

4.4 数组的引用

代码例子:

package main.java.com.ningzhaosheng.lambada.demo1.array;

import java.util.function.Function;

/**
 * @author ningzhaosheng
 * @date 2024/6/28 10:55:26
 * @description 测试数组引用
 */
public class TestArray {
    public static void main(String[] args) {
        Function<Integer,String[]> function = (x)->new String[x];
        String[] strings = function.apply(10);
        System.out.println(strings.length);

        Function<Integer,String[]> function1 = String[]::new;
        String[] strings1 = function1.apply(50);
        System.out.println(strings1.length);
    }
}

五、Lambda的使用场景

通过使用Lambda表达式,我们可以写出更简洁、易读的代码,提高代码的可维护性和开发效率。下面列举一下它的使用场景。

5.1 简化编程

使用lambda表达式可以简化代码,避免定义一大堆小方法。

5.2 函数式接口

只包含一个抽象方法的接口称为函数式接口。这些接口可以使用lambda表达式。

例如:

Runnable r = () -> System.out.println("Hello, World!");
new Thread(r).start();

5.3 事件处理

在Java GUI编程中,lambda表达式经常用于按钮点击等事件的处理。

例如:

JButton button = new JButton("Click Me");
button.addActionListener(event -> System.out.println("Button clicked!"));

5.4 并行处理

Java 8的流(Stream)库使用lambda表达式来进行并行处理。

例如:

package main.java.com.ningzhaosheng.lambada.demo2;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;

/**
 * @author ningzhaosheng
 * @date 2024/7/2 9:52:30
 * @description 测试Java8 lambda stream
 */
public class TestLambdaStream {
    public static void main(String[] args) {

        // 创建一个包含一百万个随机整数的列表
        List<Integer> numbers = new ArrayList<>();
        for (int i = 0; i < 100000; i++) {
            numbers.add(ThreadLocalRandom.current().nextInt(199));
        }
        //顺序流的处理
        long startTimeSeq = System.currentTimeMillis();
        double averageSequential = numbers.stream()
                .mapToInt(Integer::intValue)
                .average()
                .getAsDouble();
        long endTimeSeq = System.currentTimeMillis();
        System.out.println("sequential Average:" + averageSequential);

        System.out.println("Time taken (Sequential): " + (endTimeSeq - startTimeSeq) + "ms");

        //并行流的处理
        long startTimePar = System.currentTimeMillis();
        double averageParallel = numbers.parallelStream()
                .mapToInt(Integer::intValue)
                .average()
                .getAsDouble();

        long endTimePar = System.currentTimeMillis();

        System.out.println("parallel Average: " + averageParallel);

        System.out.println("Time taken (Parallel): " + (endTimePar - startTimePar) + "ms");

    }
}

可以看出,顺序流和并行流得到了相同的平均值,但并行流的处理时间明显少于顺序流。因为并行流能够将任务拆分成多个小任务,并在多个处理器核心上同时执行这些任务。

当然并行流也有缺点:

  • 对于较小的数据集,可能并行流更慢
  • 数据处理本身的开销较大,比如复杂计算、大量IO操作、网络通信等,可能并行流更慢
  • 可能引发线程安全问题

好了,本次内容就分享到这,欢迎关注本博主。如果有帮助到大家,欢迎大家点赞+关注+收藏,有疑问也欢迎大家评论留言!

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

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

相关文章

统计鸟:小而美的网站流量统计工具,免费好用

目前常见的网站流量统计平台有百度统计、Google Analytics、51.LA、友盟等&#xff0c;但Google Analytics在国内打不开、友盟已收费、百度统计限制较多、51.LA也很可能走向收费&#xff0c;无奈的我总算在网上搜到一款小众而好用的网站流量统计工具——统计鸟&#xff0c;现给…

探索Toshiba东芝TLP265J光耦合器

在当今的电子元件市场中&#xff0c;寻找高质量和高可靠性的光耦合器解决方案对许多工程师和设计师来说至关重要。TLP265J这款产品在性能、安全性和可靠性方面均表现卓越&#xff0c;适用于多种工业和商业应用。本文将深入探讨TLP265J的特点、应用领域以及其技术优势&#xff0…

探索PcapPlusPlus开源库:网络数据包处理与性能优化

文章目录 0. 本文概要1. PcapPlusPlus介绍1.1 概述1.2主要特性和功能1.3 PcapPlusPlus 主要模块关系和依赖1.4 网络协议层处理过程 2. 实例2.1 基于 PcapPlusPlus 的应用程序设计和封装流程&#xff1a;2.2 多线程示例代码2.3 代码说明&#xff1a; 3. 程序性能进一步优化3.1 避…

基于人脸识别的考勤系统(Qt+opencv+Arm)测试报告

目录 1、项目描述 2、服务器端测试 2.1、注册人脸 A、填写基本信息 B、点击打开摄像头采集信息 C、点击拍照&#xff0c;提示数据库保存人脸信息成功 D、点击注册&#xff0c;提示注册成功 至此&#xff0c;服务器启动测试完毕 3、客户端测试 3.1、人脸验证测试 3.2、服务器端点…

2024 年江西省研究生数学建模竞赛A题:交通信号灯管理问题分析、实现代码及参考论文

2024 年江西省研究生数学建模竞赛题目交通信号灯管理 1 题目 交通信号灯是指挥车辆通行的重要标志&#xff0c;由红灯、绿灯、 黄灯组成。红灯停、绿灯行&#xff0c;而黄灯则起到警示作用。交通 信号灯分为机动车信号灯、非机动车信号灯、人行横道信号 灯、方向指示灯等。 一…

生产环境 CentOS 7 k8s v1.28.0离线部署

背景描述&#xff1a;CentOS 7 Kubernetes 离线部署 随着云计算和微服务架构的普及&#xff0c;Kubernetes&#xff08;K8s&#xff09;已经成为容器编排的标准工具。它能够自动化应用的部署、扩展和管理&#xff0c;使得开发和运维的工作更加高效和可靠。然而&#xff0c;在一…

(亲测有效)2024代替电视家的app,电视家停了还有什么软件可以看电视?

嘿&#xff0c;大家好&#xff0c;我是阿星&#xff0c;今天又来跟大家聊聊那些让人眼前一亮的电视直播软件。咱们这回不聊那些老掉牙的&#xff0c;来点新鲜的&#xff0c;让咱们的电视屏幕也能跟上潮流&#xff0c;享受一下科技带来的便利和乐趣。 首先&#xff0c;得提一提…

【Sklearn-驯化】一文分析教你如何使用k-means进行数据聚类

【Sklearn-驯化】一文分析教你如何使用k-means进行数据聚类 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档关注&#…

工业读码器与商用扫码器的区别

条码二维码在数字信息化应用越来越广泛&#xff0c;扫码器成为了数据收集和处理的重要工具&#xff0c;无论是工厂生产和物流包裹朔源追踪&#xff0c;还是商场超市扫码收银和餐饮娱乐等场景&#xff0c;均能看到扫码器的辅助&#xff0c;市场上的扫码器种类繁多&#xff0c;在…

深入解析:Java爬虫的本质是什么?

深入解析&#xff1a;Java爬虫的本质是什么&#xff1f; 引言&#xff1a; 随着互联网的快速发展&#xff0c;获取网络数据已成为许多应用场景中的重要需求。而爬虫作为一种自动化程序&#xff0c;能够模拟人类浏览器的行为&#xff0c;从网页中提取所需信息&#xff0c;成为了…

生物墨水的重要特性

生物打印技术正以前所未有的速度发展&#xff0c;为组织工程和再生医学领域带来了革命性的变革。然而&#xff0c;成功打印出功能性的三维结构&#xff0c;并将其应用于人体&#xff0c;离不开生物墨水这一关键材料。主要特性包括&#xff1a; 物理性质 表面张力: 表面张力影…

安科瑞新能源系统光储充能量监控管理

一、组网拓扑 安科瑞企业微电网能量管理系统Acrel-2000MG&#xff0c;是安科瑞根据新型电力系统下微电网监控系统与微电网能量管理系统的要求&#xff0c;总结国内外的研究和生产的先进经验&#xff0c;专门研制出的企业微电网能量管理系统。本系统满足光伏系统、风力发电、储…

微信小程序渲染层与逻辑层交互原理

1. 网页开发与小程序开发有何不同&#xff1f; 2. 小程序运行环境 3. 页面渲染技术选型 1. 纯客户端技术&#xff1b; 2. 纯Web技术&#xff1b; 3. 用客户端原生技术与Web技术结合的混合技术&#xff08;Hybrid&#xff09;&#xff0c;小程序就是使用的这种技术&#xff1…

试用笔记之-Delphi 7 发送阿里云短信源代码

Delphi 7 发送阿里云短信源代码 首先下载&#xff1a; http://www.htsoft.com.cn/download/Delphi7_AlliSms_Demo.rar 解压后&#xff0c;可以看到Delphi7的源代码 我们直接运行Alisms_delphi7.exe&#xff0c;出现下图界面&#xff0c;我们输入阿里云帐号和密码&#xff0c…

Langchain-Chatchat本地部署记录,三分钟学会!

1.前言&#xff1a; 最近AI爆发式的火&#xff0c;忆往昔尤记得16,17那会移动互联网是特别火热的&#xff0c;也造富了一批公司和个人&#xff0c;出来了很多精妙的app应用。现在轮到AI发力了&#xff0c;想想自己也应该参与到这场时代的浪潮之中&#xff0c;所以就找了开源的…

四川蔚澜时代电子商务有限公司打造抖音电商服务新高地

在数字化浪潮汹涌澎湃的今天&#xff0c;电商行业以其独特的魅力和强大的市场潜力&#xff0c;成为了推动经济增长的新引擎。四川蔚澜时代电子商务有限公司&#xff0c;作为这个领域的佼佼者&#xff0c;正以其专业的服务、创新的理念和卓越的实力&#xff0c;引领抖音电商服务…

RK3568驱动指南|第十五篇 I2C-第168章 I2C通信时序介绍

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

MySQL之应用层优化(二)

应用层优化 Web服务器问题 寻找最优并发度 每个Web服务器都有一个最佳并发度——就是说&#xff0c;让进程处理请求尽可能快&#xff0c;并且不超过系统负载的最优的并发连接数。这就是前面说的最大系统容量。进行一个简单的测量和建模&#xff0c;或者只是反复试验&#xf…

SpringBoot创建一个初始化项目

提示&#xff1a;这一篇文章&#xff0c;主要是为了之后可以快速的去搭建项目&#xff0c;当然这篇博客&#xff0c;作者也会根据以后学习到的东西&#xff0c;慢慢去整理 文章目录 前言 搭建一个SpringBoot项目&#xff0c;目的是为了快速开发项目 项目列表 响应枚举类 /***…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 7月2日,星期二

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年7月2日 星期二 农历五月廿七 1、 中指研究院&#xff1a;业主“以价换量”促交易特征明显&#xff0c;6月百城二手住宅价格继续下行。 2、 多家银行宣布&#xff01;停止手机银行ATM扫码取款服务&#xff0c;“安全”成为…