Java Lambda表达式:简洁高效的函数式编程

1  lambda表达式

  • Lambda 表达式本质是一个匿名函数,用于把函数作为参数,传入方法中,实现函数式编程风格。

  • 使用Lambda 表达式可以使代码变的更加简洁紧凑。

语法格式

(parameters)-> expression (parameters)->{ statements;}

示例:

public class Demo01 {public static void main(String[] args) {Thread t1 = new Thread(new Runnable() {@Overridepublic void run() {System.out.println("子线程1开始执行任务");}});t1.start();//lambda表达式写法Thread t2 = new Thread(()-> System.out.println("子线程2开始执行任务"));t2.start();}
}

使用匿名内部类
1.定义了一个没有名字的类
2.这个类实现了Runnable接口
3.重写了run方法,实例化这个匿名内部类对象
冗余
其实最关注的是run方法里面要执行的代码
lambda表达式体现的是函数式编程思想,只需要将需要执行的代码放到函数中
lambda表达式是一个匿名函数

public class Demo02 {public static void main(String[] args) {swim(new ISwim(){@Overridepublic void swimming() {System.out.println("Forg游泳");}});System.out.println("----------------------------");//lambda相当于对接口抽象方法的重写swim(()->System.out.println("Hello World"));}public static void swim(ISwim s) {System.out.println("进入swim方法中");s.swimming();System.out.println("结束swim方法");}
}//无参,无返回值
interface ISwim{void swimming();
}

 lambda可以创建函数式接口
函数式接口:@FunctionalInterface
接口中的有且仅有一个抽象方法的接口,称为函数式接口(静态方法,默认方法,抽象方法只有一个)
语法格式:
接口名  对象名 = (参数类型1  参数名1,...参数类型n  参数名n) ->{方法体;}
参数类型n 参数名n:接口中抽象方法的参数项
->:表示连接操作
{}:存放重写的方法体内容,可以理解为对抽象方法的覆盖。

 简写:
1.参数类型可以简写
2.小括号,当参数只有1个时,可以省略
3.{}、return:同时进行省略,方法体语句只有一条时

public class Demo03 {public static void main(String[] args) {List<Integer> list = Arrays.asList(2,6,4,7,5,1,9,0,8,3);
//        list.sort(new Comparator<Integer>() {
//            @Override
//            public int compare(Integer o1, Integer o2) {
//                return o1 - o2;
//            }
//        });//lambda表达式
//        list.sort((Integer i1, Integer i2) ->{return i2-i1;});//删除了全部的参数类型
//        list.sort((o1, o2) -> {return o1 - o2;});//删除了{} return ;list.sort((o1, o2) -> o1 - o2);System.out.println(list);}
}

2  函数式接口Functional Interface

只有一个抽象方法的接口(可以定义多个非抽象方法)。可以使用@FunctionalInterface接口定义,强化语义规范。

函数式接口,也被称为SAM 接口(Single Abstract Method Interfaces

作用

基于函数式接口,可以使用Lambda表达式进行实现,实现函数式编程。

目标:

  • 了解内置函数式接口由来
  • 了解常用内置函数式接口

常用内置函数式接口介绍

Java 8 中专门有一个包放函数式接口java.util.function,该包下的所有接口都有 @FunctionalInterface 注解,提供函数式编程方式。下面是最常用的几个接口。

1  Supplier接口 -- 供给型接口

java.util.function.Supplier<T> 接口 - 方法没有参数,有返回值--供给型接口。

它意味着"供给" , 对应的Lambda表达式需要“对外提供”一个符合泛型类型的对象数据。

供给型接口,通过Supplier接口中的get方法可以得到一个值,无参有返回的接口。

public class Demo01 {public static void main(String[] args) {System.out.println("进入到了man方法");printMax(()->{System.out.println("进入到get方法中了");Integer[] arrays={1,2,3,4,5};Integer num=Collections.max(Arrays.asList(arrays));System.out.println("在get中找到最大值:"+num);return num;});int n=number(()->{Random random=new Random();int num;while(((num=random.nextInt(11,20)) & 1)!=0){}return num;});System.out.println("随机整数为:"+n);}public static void printMax(Supplier<Integer> supplier){System.out.println("进入到printMax方法中了");Integer max = supplier.get();System.out.println("printMax返回值为:"+max);}public static Integer number(Supplier<Integer> supplier){return supplier.get();}
}

2  Consumer接口 --消费型接口

java.util.function.Consumer<T> 接口则正好相反 --方法有参数,没有返回值,它不是生产一个数据,而是消费一个数据,其数据类型由泛型参数决定。 --消费型接口

Consumer消费型接口,可以拿到accept方法参数传递过来的数据进行处理, 有参无返回的接口。

public class Demo02 {public static void main(String[] args) {//转小写caseLetter(t-> System.out.println(t.toLowerCase()),"HelloWorld");//转大写caseLetter(t-> System.out.println(t.toUpperCase()),"HelloWorld");//先转小写,再转大写caseLetters(t-> System.out.println(t.toLowerCase()),t-> System.out.println(t.toUpperCase()),"HelloWorld");}public static void caseLetter(Consumer<String> consumer,String str){consumer.accept(str);}public static void caseLetters(Consumer<String> consumer1,Consumer<String> consumer2,String str){consumer1.andThen(consumer2).accept(str);}}

3  Function接口 --转换型接口

java.util.function.Function<T,R>接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件, 后者称为后置条件。有参数有返回值。----- 此方法接收一个参数,加工处理成另一种,称为转换型接口

Function转换型接口,对apply方法传入的T类型数据进行处理,返回R类型的结果,有参有返回的接口。使用的场景 例如:将 String类型转换为 Integer类型。

public class Demo03 {public static void main(String[] args) {//1.获取字符串的长度Function<String, Integer> f = s -> s.length();test(f,"1234abc");//2.截取字符串的前三位,将其转换为数字test(string -> Integer.parseInt(string.substring(0,3)),"1234abc");//3.test(string -> string.length(),len->new int[len],"abcde");}public static void test(Function<String,Integer> function,String str) {Integer num = function.apply(str);System.out.println(num);}/*function1  获取字符串长度的方法function2  获取指定长度的int类型的数组*/public static void test(Function<String,Integer> function1,Function<Integer,int[]> function2,String str) {
//        Integer num = function1.apply(str);
//        int[] ints = function2.apply(num);
//        System.out.println(num);
//        System.out.println(Arrays.toString(ints));int[] arr=function1.andThen(function2).apply(str);System.out.println(Arrays.toString(arr));}
}

4  Predicate接口--断言型接口

有时候我们需要对某种类型的数据进行判断,从而得到一个boolean值结果。这时可以使用

java.util.function.Predicate<T> 接口。------接收一个参数,返回一个boolean类型的值,称为判断型接口

public class Demo04 {public static void main(String[] args) {int number=new Random().nextInt(200);//1.判断此数字是否大于等于100method(num->num>=100,number);//2.判断此数字是否为偶数method(num->(num&1)==0,number);method(num->num>=0,num->(num&1)==0,number);}public static void method(Predicate<Integer> predicate,Integer num) {boolean result = predicate.test(num);System.out.println("数字num:"+num+" 判断后的结果为:"+result);}public static void method(Predicate<Integer> predicate1,Predicate<Integer> predicate2,Integer num) {boolean result1 = predicate1.and(predicate2).test(num);System.out.println("数字num:"+num+" 是否大于100并且为偶数?"+result1);boolean result2 = predicate1.or(predicate2).test(num);System.out.println("数字num:"+num+" 是否大于100或者为偶数?"+result2);boolean result3 = predicate1.negate().test(num);System.out.println("数字num:"+num+" 是否不大于100?"+result3);boolean result4 = predicate2.negate().test(num);System.out.println("数字num:"+num+" 是否不为偶数?"+result4);}
}

5  Comparator接口--比较器接口

比较器接口,用于比较指定元素值的大小。Java8版本中,添加了多个新的default方法,用于比较器合并、反转等操作。

// 案例数据
List<String> langList = Arrays.asList("Basic", "QBasic","HTML", "c", "c++", "PowerBuilder", "go", "Visual Basic", "c#","java");// 按照ASCII码比较
Comparator<String> comparator1 = (s1, s2) -> {return s1.compareTo(s2);
};// 按照长度比较
Comparator<String> comparator2 = (s1, s2) -> {return s1.length() - s2.length();
};// 先比较长度,再比较ASCII码
Comparator<String> comparator3 = comparator2.thenComparing(comparator1);// 在comparator3的基础上,反转条件
Comparator<String> comparator4 = comparator2.reversed();// 按照指定Comparator,进行排序
langList.sort(comparator2);

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

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

相关文章

python中的集合

目录 初识集合 集合的含义 集合的作用 集合的使用场景 集合的定义 集合的常用操作 元素的增加 函数add() 元素的删除 函数remove() 函数clear() 函数pop() 集合的遍历 for循环 while循环 初识集合 集合的含义 在pyrhon中&#xff0c;集合是一种内置的数据结构…

如何将普通HTTP API接口改造为MCP服务器

在现代微服务架构中&#xff0c;MCP&#xff08;Mesh Configuration Protocol&#xff09; 作为高效配置分发协议&#xff0c;正逐渐替代传统HTTP API。本文将手把手教你如何将普通HTTP API升级为高性能MCP服务器。 为什么需要MCP&#xff1f; 传统HTTP API在配置分发场景存在…

数据结构第8问:什么是树?

树 【本节仅描述树的定义、术语以及相关性质】 定义 树是由若干个结点组成的有限集合。具有如下特征&#xff1a; 有且仅有一个根结点&#xff1b;除根结点外&#xff0c;每个其它结点有且仅有一个直接的父结点&#xff1b;除根结点外&#xff0c;每个结点可以有零个或者多个子…

PyTorch RNN 名字分类器

PyTorch RNN 名字分类器详解 使用PyTorch实现的字符级RNN&#xff08;循环神经网络&#xff09;项目&#xff0c;用于根据人名预测其所属的语言/国家。该模型通过学习不同语言名字的字符模式&#xff0c;够识别名字的语言起源。 环境设置 import torch import string import un…

面向对象之类方法,成员变量和局部变量

1.类的方法必须包含几个部分&#xff1f;2.成员变量和局部变量类的方法必须包含哪几个部分&#xff1f;.方法名&#xff1a;用于标识方法的名称&#xff0c;遵循标识符命名规则&#xff0c;通常采用驼峰命名法。返回值类型&#xff1a;指定方法返回的数据类型。如果方法不返回任…

古法笔记 | 通过查表进行ASCII字符编码转换

ASCII字符集是比较早期的一种字符编码&#xff0c;只能表示英文字符&#xff0c;最多能表示128个字符。 字符集规定了每个字符和二进制数之间的对应关系&#xff0c;可以通过查表完成二进制数到字符的转换ASCII字符占用的存储空间是定长的1字节 ASCII字符的官方码点表见下图&…

Linux C实现单生产者多消费者环形缓冲区

使用C11里的原子变量实现&#xff0c;没有用互斥锁&#xff0c;效率更高。ring_buffer.h:/*** file ring_buffer.h* author tl* brief 单生产者多消费者环形缓冲区&#xff0c;每条数据被所有消费者读后才释放。读线程安全&#xff0c;写仅单线程。* version* date 2025-08-06*…

复杂场景识别率↑31%!陌讯多模态融合算法在智慧环卫的实战解析

摘要&#xff1a;针对边缘计算优化的垃圾堆放识别场景&#xff0c;本文解析了基于动态决策机制的视觉算法如何提升复杂环境的鲁棒性。实测数据显示在遮挡/光照干扰下&#xff0c;mAP0.5较基线提升28.3%&#xff0c;误报率降低至行业1/5水平。一、行业痛点&#xff1a;智慧环卫的…

MyBatis-Plus Service 接口:如何在 MyBatis-Plus 中实现业务逻辑层??

全文目录&#xff1a;开篇语前言1. MyBatis-Plus 的 IService 接口1.1 基本使用示例&#xff1a;创建实体类 User 和 UserService1.2 创建 IService 接口1.3 创建 ServiceImpl 类1.4 典型的数据库操作方法1.4.1 save()&#xff1a;保存数据1.4.2 remove()&#xff1a;删除数据1…

[激光原理与应用-168]:光源 - 常见光源的分类、特性及应用场景的详细解析,涵盖技术原理、优缺点及典型应用领域

一、半导体光源1. LED光源&#xff08;发光二极管&#xff09;原理&#xff1a;通过半导体PN结的电子-空穴复合发光&#xff0c;波长由材料带隙决定&#xff08;如GaN发蓝光、AlGaInP发红光&#xff09;。特性&#xff1a;优点&#xff1a;寿命长&#xff08;>5万小时&#…

Metronic v.7.1.7企业级Web应用前端框架全攻略

本文还有配套的精品资源&#xff0c;点击获取 简介&#xff1a;Metronic是一款专注于构建响应式、高性能企业级Web应用的前端开发框架。最新版本v.7.1.7引入了多种功能和优化&#xff0c;以增强开发效率和用户体验。详细介绍了其核心特性&#xff0c;包括响应式设计、多种模…

鸿蒙开发--Notification Kit(用户通知服务)

通知是手机系统中很重要的信息展示方式&#xff0c;通知不仅可以展示文字&#xff0c;也可以展示图片&#xff0c;甚至可以将组件加到通知中&#xff0c;只要用户不清空&#xff0c;通知的信息可以永久保留在状态栏上通知的介绍 通知 Notification通知&#xff0c;即在一个应用…

鸿蒙 - 分享功能

文章目录一、背景二、app发起分享1. 通过分享面板进行分享2. 使用其他应用打开二、处理分享的内容1. module.json5 配置可接收分享2. 解析分享的数据一、背景 在App开发中&#xff0c;分享是常用功能&#xff0c;这里介绍鸿蒙开发中&#xff0c;其他应用分享到自己的app中&…

【Agent 系统设计】基于大语言模型的智能Agent系统

一篇阿里博文引发的思考和探索。基于大语言模型的智能Agent系统 1. 系统核心思想 核心思想是构建一个以大语言模型&#xff08;LLM&#xff09;为“大脑”的智能代理&#xff08;Agent&#xff09;&#xff0c;旨在解决将人类的自然语言指令高效、准确地转化为机器可执行的自动…

企业级Web框架性能对决:Spring Boot、Django、Node.js与ASP.NET深度测评

企业级Web应用的开发效率与运行性能直接关系到业务的成败。本文通过构建标准化的待办事项&#xff08;Todo&#xff09;应用&#xff0c;对四大主流框架——Spring Boot、Django、Node.js和ASP.NET展开全面的性能较量。我们将从底层架构特性出发&#xff0c;结合实测数据与数据…

为什么 `source ~/.bashrc` 在 systemd 或 crontab 中不生效

摘要&#xff1a;你是否遇到过这样的问题&#xff1a;在终端里运行脚本能正常工作&#xff0c;但用 systemd 或 crontab 自动启动时却报错“命令找不到”、“模块导入失败”&#xff1f; 本文将揭示一个深藏在 ~/.bashrc 中的“陷阱”&#xff1a;非交互式 shell 会直接退出&am…

Linux 磁盘中的文件

1.磁盘结构 Linux中的文件加载到内存上之前是放到哪的&#xff1f; 放在磁盘上的文件——>访问文件&#xff0c;打开它——>找到这个文件——>路径 但文件是怎样存储在磁盘上的 1.1物理结构磁盘可以理解为上百亿个小磁铁&#xff08;如N为1&#xff0c;S为0&#xff0…

【方法】Git本地仓库的文件夹不显示红色感叹号、绿色对号等图标

文章目录前言开始操作winr&#xff0c;输入regedit&#xff0c;打开注册表重启资源管理器前言 这个绿色对号图标表示本地仓库和远程的GitHub仓库内容保持一致&#xff0c;红色则是相反咯&#xff0c;给你们瞅一下。 首先这两个东西你一定要安装配置好了&#xff0c;安装顺序不…

量化交易与主观交易:哪种方式更胜一筹?

文章概要 在投资的世界里&#xff0c;量化交易和主观交易如同冰与火&#xff0c;各自拥有独特的优势与挑战。作为一名投资者&#xff0c;了解这两种交易方式的差异和各自的优缺点至关重要。本文将从决策依据、执行方式、风险管理等方面深入探讨量化交易的精确性与主观交易的灵活…

【JS】扁平树数据转为树结构

扁平数据转为最终效果[{"label":"疼逊有限公司","code":"1212","disabled":false,"parentId":"none","children":[{"label":"财务部","code":"34343&quo…