Lambda - 进阶

news/2024/4/19 7:14:44/文章来源:https://blog.csdn.net/zy52002520/article/details/128091563

一、Lambda 表达式

1. 概念

Lambda表达式是一个匿名函数,没有函数名。

2. 作用

在运行时,动态的定义一个方法,让定义方法变得简单,方法变成变量,随时可以替换

public class LambdaDemo {public static void main(String[] args) {MathOperation s = (int a, int b) -> a * b;System.out.println(s.operation(14, 2));// lambda 既是一个实现,也是一个对象,普通接口实现类,需要new实例化enact((str) -> System.out.println(str), "hello");// 方法引用InterfaceLambda str = System.out::println;str.doSomeShit("interface");}public static void enact(InterfaceLambda lambda, String s) {lambda.doSomeShit("lambda");System.out.println(s);}
}interface MathOperation {int operation(int a, int b);default int operation2(int a, int b) {return 0;}
}interface InterfaceLambda {void doSomeShit(String str);
}

3. 函数签名

返回参数 + 函数名 + 参数类型的列表  

4. 常见写法

4.1 不需要参数,返回值为5:   () -> 5

4.2 接收一个参数(数字类型,返回2倍) x -> 2*x

4.3 接收两个参数,并返回他们的差 (x,y) -> x-y

4.4 接收2个int型整数,返回他们的和 (int x,int y) - x + y

4.5 接收一个string对象,并在控制台答应 (String s) -> System.out.print(s)

// Java 7 
public Interface MyLambdaInterface {void doSomething(String s);
}public MyInterfactImpl implements MyLambadInterface {@Overridepublic void doSomething(String s){System.out.printIn(s);}
}MyLambdaInterface a = new MyInterfactImpl();// Java 8 这种写法的要求是接口必须只有一个方法,如果接口必须要多个方法,可以声明为default方法,运行时会生成匿名内部类
MyLambdaInterace m = (s) -> System.out.printIn(s);

5. 函数式接口 @FunctionalInterface

     Predicate<T>  有参数,有条件判断

     Function<T,R>  有参数,有返回值

    Consumer<T>  有参数,无返回值

    Supplier<T>   无参数、有返回值

二、Stream

1. Java 实现接口多继承用&

public class StreamDemo< T extends Serializable&Comparable >{}

2. 概念:Stream(流)是一个来自数据源的元素队列并支持聚合操作

  • 元素:特定类型的对象,行程一个队列。Java中的Stream并不会存储元素,而是按需计算。
  • 数据源:流的来源。可以是集合,数组,I/O channel,产生器generator等。
  • 聚合操作:类似SQL语句一样的操作,比如filter,map,reduce,find,match,sorted等。
  • 和以前的Collection操作不同,Stream操作还有两个基础的特征
    • Pipelinging:中间操作都会返回流对象本身。这样多个操作可以串联成一个管道,如同流式风格。这样做可以对操作进行优化,比如延迟执行和短路。
    • 内部迭代:以前对集合遍历都是通过Iterator或者for-each的方式,显示的在集合外部进行迭代,这叫作外部迭代。Stream提供了内部迭代的方式,通过访问者模式实现。通过内部的方式只要循环一次,就解决所有问题。

3. Stream操作

中间操作:

1. 选择与过滤

filter(Predicate p) 接收Lambda,从流中排除某些元素。

distinct()筛选,通过流所生成的元素的hashCode()和equal()去除重复元素

limit(Long maxsize)截断流,使其元素不超过给定数量。

skip(long n)跳过元素,返回一个扔掉了前n个元素的流。若流中元素不足n个,则返回一个空流。

2. 映射

map(Function f)接收lambda,将元素转换成其它形式或提取信息;接收一个函数作为参数,该函数会被应道到每一个元素上,并将其映射成一个新的元素。

mapToDouble(ToDoubleFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的DoubleStream。

mapToInt(ToIntFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的IntStream。

mapToLong(ToLongFunction f)接收一个函数作为参数,该函数会被应用到每个元素上,产生一个新的LongStream。

flatMap(Function f)接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有的流连成一个流

3. 排序

sorted() 产生一个新流,其中按自然顺序排序

sorted(Comparator comp)产生一个新流,其中按比较器的规则排序

终止操作

1. 查找与匹配

        allMatch - 检查是否匹配所有元素

        anyMatch - 检查是否至少匹配一个元素

        noneMatch - 检查是否没有匹配的元素

        findFirst - 返回第一个元素

        findAny - 返回当前流中的任意元素

        count - 返回流中元素的总个数

        max - 返回流中最大值

        min - 返回流中最小值

2. 规约 reduce,需要初始化(类比Map - Reduce)

3. 收集Collect

        toList List<T> 把流中元素收集到List

        toSet Set<T> 把流中元素收集到Set

        toCollection Collection<T> 把流中元素收集到创建的集合

        count 计算流中元素的个数

        summaryStatistics 统计最大最小平均值

4. 迭代 forEach

Stream 代码

public class StreamDemo {public static void main(String[] args) {List<Integer> list = Arrays.asList(2, 3, 4, 21, 33, 2, 2);// Optional :stream中间操作返回封装类,防止空指针Optional<Integer> first = list.stream().findFirst();// orElse: 如果是空,给默认值100sSystem.out.println(first.map(i -> i * 10).orElse(100));// reduce: 需要给一个初始值0,依次相加,如果是乘法,初始值要改成1int sum = list.stream().filter((x) -> x < 5).distinct().reduce(0, (a, b) -> a + b);System.out.println(sum);// MapMap<Integer, Integer> map = list.parallelStream().collect(Collectors.toMap(a -> a, a -> a + 1, (a, b) -> a, HashMap::new));System.out.println(map);List<Integer> list1 = map.entrySet().parallelStream().map(e -> e.getKey() + e.getValue()).collect(Collectors.toList());System.out.println(list1);System.out.println(list.stream().map(e -> e + 1).collect(Collectors.toList()));}
}

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

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

相关文章

分布式消息中间件RabbitMQ解析

RabbitMQ作为分布式消息存储和转发系统&#xff0c;已广泛使用于分布式系统中。本文简要介绍RabbitMQ相关概念、集群架构和消息转发流程&#xff0c;并与Kafka做了简要对比&#xff0c;以加深理解。 1、RabbitMQ相关概念 1.1 AMQP介绍 消息&#xff08;Message&#xff09;是…

Zookeeper(一)- Zookeeper介绍与集群部署

文章目录一、Zookeeper 介绍1. Zookeeper概述2. Zookeeper工作机制3. Zookeeper特点4. Zookeeper数据结构5. Zookeeper应用场景&#xff08;1&#xff09;统一命名服务&#xff08;2&#xff09;统一配置管理&#xff08;3&#xff09;统一集群管理&#xff08;4&#xff09;服…

低代码与mes生产管理系统:功能篇

随着信息技术的发展和应用,信息系统在企业中的使用也越来越广泛。不仅可以使企业内部和企业间的信息流通更为便捷和频繁&#xff0c;同时可以提高管理的水平&#xff0c;有助于提高企业的生产效益。其中mes生产管理系统就是美豳的调查资询公司AMR(Advanced Manufacturing Resea…

【目标检测】Faster R-CNN的几点理解

目录&#xff1a;Faster R-CNN的几点理解一、Faster R-CNN概述二、R-CNN、Fast R-CNN、Faster R-CNN的对照2.1 R-CNN2.1.1 R-CNN的检测步骤2.1.2 R-CNN的主要缺点2.2 Fast R-CNN2.2.1 Fast R-CNN的检测步骤2.2.2 Fast R-CNN的缺点2.3 R-CNN、Fast R-CNN、Faster R-CNN的比较三、…

(二)devops持续集成开发——jenkins的权限管理配置

前言 jenkins作为目前主流的devops工具&#xff0c;受到了广大开发用户的追捧。由于其丰富的插件库&#xff0c;其可插拔的功能使得其功能和生态都十分强大。本节内容是关于jenkins的权限管理组件Role-based Authorization Strategy的安装及使用。 正文 下载安装Role-based A…

ThinkPHP5文档学习——配置

文章目录一、配置目录二、配置格式PHP数组定义其它格式的支持二级配置三、配置加载惯例配置应用配置拓展配置场景配置四、读取配置参数五、动态配置设置配置参数六、独立配置独立配置文件V5.0.1版本已经废除该写法自动读取扩展配置七、配置作用域八、环境变量配置一、配置目录 …

历届图灵奖得主盘点

图灵奖&#xff0c;全称A.M.图灵奖&#xff08;ACM A.M Turing Award&#xff09;&#xff0c;是由美国计算机协会于1966年设立的计算机奖项&#xff0c;名称取自艾伦麦席森图灵&#xff0c;旨在奖励对计算机事业作出重要贡献的个人 。图灵奖对获奖条件要求极高&#xff0c;评奖…

第十三章《集合》第3节:Set集合

Set也是Collection的子接口,它定义了另一种形式的集合,专业上称之为Set集合。Set集合的特点如图13-9所示。 图13-9 Set类型集合 从图13-9可以看出:Set类型的集合就像是一个装苹果的筐子,程序员只要把元素存入这个筐子即可。集合中的元素像是胡乱堆积在一起,因此元素没有索…

12【MyBatis注解开发】

文章目录三、Mybatis注解开发3.1 快速入门3.1.1 常用注解说明3.1.2 注解实现开发3.2 注解实现一对一映射3.2.1 接口3.2.2 测试类3.3 注解实现一对多映射3.2.1 接口3.2.2 测试类三、Mybatis注解开发 3.1 快速入门 3.1.1 常用注解说明 注解功能Insert新增Update更新Delete删除…

小学生python游戏编程arcade----单词对错检测及记录写入excel中

小学生python游戏编程arcade----单词对错检测及记录写入excel中前言单词对错检测及记录写入excel中1、excel读取修改1.1 excel读取1.2 修改用到的库1.3 获取Excel表格名称的三种方式1.4 excel格式问题excel文件保存2.1 保存函数2.2 实验2.3 游戏中调用修改2.4 升级时保存字典内…

PCL 点云的法向量

一&#xff0c;点的法向量 点云法线 法向量的概念是很小的时候我们就已经说的&#xff0c;法向量是我们点云中一个非常重要的属性&#xff0c;诸如饿哦们常说的三维重建、点云分割&#xff0c;点云去噪 以及特种描述算法等。 特性&#xff1a; 点云中每一点的法向量夹角和曲率…

面试汇总-MySQL-杂项

目录 1、悲观锁和乐观锁 2、数据库关键字的执行顺序是什么&#xff1f; 3、SQL优化 3.1、如何进行sql优化&#xff1f; 3.2、常见的join算法 3.2.1、Hash Join 3.2.2、Merge Join 3.2.3、Nested Loop Join 3.3、Join前后表的数据量对查询性能有什么影响&#xff1f; …

JavaScript_BOM

JavaScript_BOM 学习路线&#xff1a;JavaScript_BOM->Window对象->confirm()、setInterval()、setTimeout()->History、Location->闪烁的灯泡 概述 BOM&#xff1a;Browser Object Model 浏览器对象模型。也就是 JavaScript 将浏览器的各个组成部分封装为对象。…

【Shell 脚本速成】06、Shell 数组详解

目录 一、数组介绍 二、数组定义 三、数组赋值方式 四、数组取值 案例演示 五、关联数组 5.1 定义管理数组 5.2 关联数组赋值 5.3 管理数组取值 5.4 综合案例 有这样一个现实问题&#xff1a;一个班级学员信息系统&#xff0c;要求存储学员ID、NAME、SCORE、AGE、GE…

文本检测与识别技术的应用现状及产业案例

文本检测与识别技术的产业应用现状 文本是人类文明的视觉和物理载体&#xff0c;文本的检测和识别使视觉与对其内容的理解进一步联系起来。在这一部分中&#xff0c;我们列出并分析了对提高我们的生产力和生活质量产生或将产生重大影响的最杰出的项目。 自动数据录入&#xff…

鼠标监视 | 拖拽方块 | Vue

title: 拖拽功能 tags: Vue categories: JavaScript abbrlink: 18a433ce date: 2022-11-26 21:14:19 效果 代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" co…

RabbitMQ 快速入门-消息的收发

RabbitMQ 快速入门-消息的收发准备工作一、Connection 方式1. 生产者测试类2. 消费者测试类注意二、RabbitTemplate 方式1. 生产者测试类2. 创建队列3. 消费者注意准备工作 推荐创建两个 SpringBoot 项目&#xff0c;一个作为生产者&#xff0c;另一个作为消费者 也可使用 Ma…

[附源码]SSM计算机毕业设计校园征兵及退役复原管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

若依、多选框前后端处理,MyBatis处理多对多关系

背景 很经典的CRUD&#xff0c;整理下笔记。 后端 实体类 /*** 专业方向主键&#xff0c;用于下拉框搜索*/private Long disasterTypeId;/*** 专业方向*/private List<DisasterType> disasterType;业务层 /*** 新增专家信息库** param expertInfo 专家信息库* return 结…

gcc: error trying to exec ‘cc1plus‘: execvp: no such file or directory

该问题是缺少gcc文件&#xff0c;或者gcc与g版本不匹配问题 问题来源1&#xff1a;系统文件的缺失或者不匹配 按照如下方法测试 安装主要是利用apt-get安装&#xff0c;如果没有root权限的话&#xff0c;只能下载源码进行编译安装&#xff0c;然后添加路径环境&#xff0c;安…