Java Lambda语法介绍

目录

一、概述

二、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.mzph.cn/news/864601.shtml

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

相关文章

python脚本获取深度相机的内参矩阵depth_intrinsics和color_intrinsics

注意将代码中的分辨率改为自己项目中的分辨率 pip3 install pyrealsense2 import pyrealsense2 as rsdef print_intrinsics(stream_profile):"""打印给定流的内参"""intrinsics stream_profile.as_video_stream_profile().get_intrinsics()pri…

2024hw 蓝队面试题合集

2024hw 蓝队面试题合集 2024hw 蓝队面试题合集面试题及答案使用过哪些设备,出现误报怎么办?安全设备会出现误报的原因有哪些?安全设备出现误报后,如何辨别真实威胁并采取有效措施?如何在 hw 中分析webshell 流量特征请讲一下应急响应流程溯源有哪些思路怎么防范邮件钓鱼针…

第7天:面向对象编程(OOP)

学习目标 理解面向对象编程的基本概念掌握类和对象的定义和使用学习属性和方法的定义和使用理解继承和多态的概念学习类的特殊方法 学习内容 1. 面向对象编程基本概念 面向对象编程&#xff08;OOP&#xff09;是一种编程范式&#xff0c;使用“对象”来设计应用程序和计算…

云海中的坚固灯塔:等保测评视角下的混合云安全策略与合规性深度剖析

在数字化浪潮的推动下&#xff0c;混合云架构以其独特的优势成为企业转型升级的得力助手。然而&#xff0c;随着数据资产向云端迁移&#xff0c;安全风险与合规挑战亦如影随形&#xff0c;成为企业前行的绊脚石。等保测评作为我国网络安全的一道坚实屏障&#xff0c;对于护航云…

编程高手的必备技能:C语言函数库构建——模块化编程,提升代码重用性

1.引言 在编程的世界里&#xff0c;C语言以其高效、灵活的特点&#xff0c;一直以来都备受编程高手的青睐。然而&#xff0c;随着软件规模的不断扩大&#xff0c;如何提高代码的可维护性、可读性和重用性&#xff0c;成为了摆在程序员面前的一大挑战。本文将深入探讨C语言函数…

化妆品安全问答:个人护理产品| FDA

「个人护理品」是否都作为化妆品监管&#xff1f;是一些药物还是「药妆」&#xff1f; 人们经常使用“个人护理产品”这个术语来指代我们在药店和百货商店的健康和美容部门常见的各种各样的物品。根据法律规定&#xff0c;这些产品可能属于许多不同的类别。 用于清洁或美容的…

Gartner发布软件供应链安全指南:软件供应链攻击造成的损失将从 2023 年的460亿美元上升到2031年的1380亿美元

软件供应链安全是一个关键的风险和合规性问题&#xff0c;但大多数组织都以分散的方式处理它。缺乏一个包罗万象的框架会遗留安全漏洞。通过实施三支柱框架&#xff0c;安全和风险管理领导者可以确保广泛的保护。 主要发现 对软件供应链的攻击给组织带来重大的安全、监管和运营…

【深度学习】pytorch训练中的一个大坑

使用的命令&#xff1a;iostat -x 5 可以看到 ssd的利用率已经满了。 之前在的数据集放在了 hdd上&#xff0c;训练结果特别慢。 所以我把它移动到了ssd上&#xff0c;然后训练参数用的 resume&#xff0c; 但是&#xff01;&#xff01;&#xff01;&#xff01;它把历史记住…

【C语言】19.预处理详解

文章目录 1.预定义符号2.#define定义常量3.#define定义宏4.带有副作用的宏参数5.宏替换的规则6.宏函数的对比7.#和##7.1 #运算符7.2 ## 运算符 8.命名约定9.#undef10.命令行定义11.条件编译12.头文件的包含12.1 头⽂件被包含的⽅式12.1.1 本地⽂件包含12.1.2 库⽂件包含 12.2 嵌…

学懂C#编程:常用高级技术——学会C#的高级特性 反射

反射&#xff08;Reflection&#xff09;是C#中的一项高级特性&#xff0c;它允许程序在运行时检查和操作程序集、模块、类型等元数据信息。通过反射&#xff0c;你可以在不知道类型信息的情况下&#xff0c;动态地创建对象、调用方法、访问属性等。 反射的基本概念 反射的核…

甲骨文首次将LLMs引入数据库,集成Llama 3和Mistral,和数据库高效对话

信息时代&#xff0c;数据为王。数据库作为数据存储&管理的一种方式&#xff0c;正在以势不可挡的趋势与AI结合。 前有OpenAI 收购了数据库初创公司 Rockset&#xff0c;引发广泛关注&#xff1b;Oracle公司&#xff08;甲骨文&#xff09;作为全球最大的信息管理软件及服…

农学VR虚拟仿真情景实训教学

在农学课堂上&#xff0c;VR虚拟仿真情景的应用正逐渐成为一种创新的教学方式。 随着科技的飞速发展&#xff0c;VR技术以其沉浸式体验特点&#xff0c;让学生仿佛置身于另一个世界。在农学课堂上&#xff0c;通过VR技术&#xff0c;学生可以身临其境地感受农田的广袤&#xf…

ArtTS系统能力-窗口管理的学习(3.2)

上篇回顾&#xff1a; ArtTS系统能力-通知的学习&#xff08;3.1&#xff09; 本篇内容&#xff1a; ArtTS系统能力-窗口管理的学习&#xff08;3.2&#xff09; 一、 知识储备 1. 基本概念 窗口渲染式能力&#xff1a;指对状态栏、导航栏等系统窗口进行控制&#xff0c;减…

计算机硬件(考点篇)试题

波特率&#xff1a; 在电子通信领域&#xff0c;波特&#xff08;Baud&#xff09;即调制速率&#xff0c;指的是有效数据讯号调制载波的速率&#xff0c;即单位时间内载波调制状态变化的次数。波特&#xff08;Baud&#xff0c;单位符号&#xff1a;Bd&#xff09;。 波特率…

PHP景区旅游多商户版微信小程序系统源码

解锁景区新玩法&#xff01;​ 引言&#xff1a;一站式旅行新体验 厌倦了传统景区的单调游览&#xff1f;想要一次旅行就能体验多种风情&#xff1f;那么&#xff0c;“景区旅游多商户版”绝对是你的不二之选&#xff01;这个创新模式将景区内多个商户资源整合&#xff0c;为…

【MySQL备份】Percona XtraBackup增量备份实战篇

目录 1.前言 2.准备工作 2.1.环境信息 2.2.创建备份目录 2.3.配置/etc/my.cnf文件 2.4.授予root用户BACKUP_ADMIN权限 3.增量备份 3.1.第一步&#xff1a;全量备份 3.2.第二步&#xff1a;增量备份 3.3.第三步&#xff1a;再次增量备份 4.准备备份 4.1.准备全量备…

windows自带的性能采集配置方法

1 计算机---右键---管理 2 性能--数据收集器几---用户自定义 3新建--输入程序名称 并在此页面选择--手动创建&#xff08;高级&#xff09; 4 下一步--勾选性能计数器---下一步 5 添加--找到process Processor Time User Time Handle Count ID Process Private Bytes…

爬虫逆向实战(42)-某巢登陆(AES、MD5、RSA、滑块验证码)

一、数据接口分析 主页地址&#xff1a;某巢 1、抓包 通过抓包可以发现在登录时&#xff0c;网站首先请求captcha/querySlideImage/来获取滑块验证码的图片&#xff0c;然后请求captcha/checkCode/接口来验证滑块验证码。滑块验证码校验成功后&#xff0c;请求noshiro/getPu…

理解MySQL核心技术:存储过程与函数的强大功能

在大型应用程序和复杂的数据库操作中&#xff0c;存储过程与函数扮演着至关重要的角色。它们不仅可以提高代码的可维护性&#xff0c;还能加强数据库的安全性和性能。本篇文章将深入探讨MySQL存储过程与函数的基础知识、创建、管理及其在实际应用中的优势。 什么是存储过程和函…

无人机热成像分析图谱原理

一、热成像原理 热成像&#xff0c;也称为红外热成像或红外成像&#xff0c;是一种利用红外辐射&#xff08;通常指的是热辐射&#xff09;来获取物体表面温度分布信息的成像技术。在无人机上集成热成像传感器&#xff0c;可以远程捕获并分析目标物体的热特征&#xff0c;不受…