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,一经查实,立即删除!

相关文章

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

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

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

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

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

波特率&#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;不受…

【高性能服务器】多线程并发模型

&#x1f525;博客主页&#xff1a; 我要成为C领域大神&#x1f3a5;系列专栏&#xff1a;【C核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 ​​ 对于常见的C/…

ROS2使用Python开发动作通信

1.创建接口节点 cd chapt4_ws/ ros2 pkg create robot_control_interfaces --build-type ament_cmake --destination-directory src --maintainer-name "joe" --maintainer-email "1027038527qq.com" mkdir -p src/robot_control_interfaces/action touch…

跨模型知识融合:大模型的知识融合

大模型&#xff08;LLMs&#xff09;在多个领域的应用日益广泛&#xff0c;但确保它们的行为与人类价值观和意图一致却充满挑战。传统对齐方法&#xff0c;例如基于人类反馈的强化学习&#xff08;RLHF&#xff09;&#xff0c;虽取得一定进展&#xff0c;仍面临诸多难题&#…

LeetCode Top 100 题目概览及部分题目解答【两数之和,接雨水,最长回文子串,三数之和】

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

django开源电子文档管理系统_Django简介、ORM、核心模块

Django简介 Django是一种开源的大而且全的Web应用框架&#xff0c;是由python语言来编写的。他采用了MVC模式&#xff0c;Django最初是被开发来用于管理劳伦斯出版集团下的一些以新闻为主内容的网站。一款CMS(内容管理系统)软件。并于 2005 年 7 月在 BSD 许可证下发布。这套框…

Pytest+Yaml+Request+Allure+PyMsql+Jenkins+GitLab框架源代码之(二)config配置

config公共配置包 config.yml 公共配置文件&#xff0c;主要配置路径及日志 base:base_info_url: https://XXXX.combase_php_url: http://XXXX.combase_weixin_url: https://XXXX.qq.combase_fenmi_url: http://XXXXX.com # base_czt_url: http://XXXXXbase_czt_url: hhttps:…

自然语言处理:第四十章 如何与大模型交流-Prompt工程

文章链接:Principled Instructions Are All You Need for Questioning LLaMA-1/2, GPT-3.5/4 主页: VILA-Lab/ATLAS: A principled instruction benchmark on formulating effective queries and prompts for large language models (LLMs). Our paper: https://arxiv.org/abs…

Redis 7.x 系列【13】数据类型之地理位置(Geospatial)

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 常用命令2.1 GEOADD2.2 GEODIST2.3 GEORADIUS2.4 GEOPOS2.5 GEORADIUSBYMEM…