函数式编程Stream流(通俗易懂!!!)

目录

1.Lambda表达式

1.1 基本用法

1.2 省略规则

2.Stream流

2.1 常规操作 

2.1.1 创建流

2.1.2 中间操作

filter

map 

distinct

sorted 

limit

​编辑skip 

flatMap

 2.1.3 终结操作

foreach

count

max&min 

collect 

anyMatch

allMatch 

noneMatch

​编辑

findAny

findFirst 

reduce归并

​编辑2.2注意事项 

3.Optional

3.1 概述

3.2 使用

3.2.1 创建对象

3.2.2 安全消费值

 3.2.3 获取值

​编辑 3.2.4 过滤

​编辑3.2.5 判断

​编辑3.2.6 数据转换 

4.函数式接口

4.1 概述

4.2 常见函数式接口

4.3 常见的默认方法

​编辑5.方法引用 

5.1.1 引用类的静态方法

5.1.2 引用对象的实例方法

6.高级用法

基本数据类型优化

​编辑并行流 


重点:只关注传入的参数列表和方法体(数据+操作) 

1.Lambda表达式

本质是匿名内部类的优化,先写匿名内部类

1.1 基本用法
public class lambdaTest {public static void main(String[] args) {
//        int i = calculateNum((int left, int right) -> {
//            return left + right;
//        });
//        System.out.println(i);
//
//        printNum((int value) -> {
//            return value % 2 ==0;
//        });
//
//        Integer i1 = typeConver((String s)->{
//            return Integer.valueOf(s);
//        });
//        System.out.println(i1);foreachArr((int value) -> {System.out.println(value);});}public static void foreachArr(IntConsumer consumer){int [] arr = {1,2,3,4,5,6,7,8,9,10};for (int i : arr) {consumer.accept(i);}}public static <R> R typeConver(Function<String,R> function){String str = "1235";R result = function.apply(str);return result;}public static void printNum(IntPredicate predicate){int [] arr = {1,2,3,4,5,6,7,8,9,10};for (int i : arr) {if(predicate.test(i)){System.out.println(i);}}}public static int calculateNum(IntBinaryOperator operator){int a = 10;int b = 20;return operator.applyAsInt(a,b);}
}
1.2 省略规则
  • 参数类型可以省略
  • 方法体只有一句代码时大括号return和唯一一句代码的分号可以省略
  • 方法只有一个参数时小括号可以省略
  • 以上规则都记不住也可以省略不记‘

2.Stream流

 List<Object> array = new ArrayList<>();array.stream() //把集合转换成流.distinct() //去重.filter(author -> author.getAge() < 18) //过滤年龄小于18的作者.forEach(author -> System.out.println(author.getName())); //打印作者姓名
2.1 常规操作 
2.1.1 创建流

2.1.2 中间操作
filter
  • 可以对流中的元素进行条件过滤

map 
  • 可以把对流中的元素进行计算或转换

distinct
  • 可以去除流中的重复元素 

sorted 
  • 可以对流中的元素进行排序

limit
  • 可以设置流的最大长度,超出的部分将被抛弃
skip 
  • 跳过流中的前n个元素,返回剩下的元素

flatMap
  •  map只能把一个对象转换另一个对象作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素

 2.1.3 终结操作
foreach
count
  • 可以用来获取当前流中元素的个数

max&min 
  • 可以用来获取流中的最大&最小值

collect 
  • 把当前流转成一个集合

anyMatch
  • 可以用来判断是否有任意符合匹配条件的元素,结果为boolean类型 

allMatch 
  • 可以用来判断是否都符合匹配条件

noneMatch
findAny
  • 查找任意元素

findFirst 

reduce归并
  • 对流中的数据按照你指定的计算方式计算出一个结果(缩减操作)
  • reduce的作用是把stream的元素给组合起来,我们可以传入一个初始值,它会按照我们的计算方式依次拿流中的元素和在初始化值的基础上进行计算,计算结果再和后面的元素计算
2.2注意事项 
  • 惰性求值(如果没有终结操作,)
  • 流是一次性的(一旦一个流对象经过一个终结操作后,这个不能再被使用)
  • 不会影响原数据

3.Optional

3.1 概述

我们在编写代码的时候出现最多的就是空指针异常。所以在很多情况下我们需要做各种非空的判断。

3.2 使用
3.2.1 创建对象

Optional就好像是包装类,可以把我们的具体数据封装Optional对象内部。然后我们去使用Optional中封装好的方法操作封装进去的数据就可以避免空指针异常。

3.2.2 安全消费值

 3.2.3 获取值

不推荐使用

 3.2.4 过滤
3.2.5 判断
3.2.6 数据转换 

4.函数式接口

4.1 概述

只有一个抽象方法的接口我们称之为函数式接口

JDK的函数式接口都加上了@Functionallnterface注解进行标识。

4.2 常见函数式接口
  • Consumer消费接口
  • Function计算转换接口
  • Predicate判断接口
  • Supplier生产型接口
4.3 常见的默认方法
  • and

  • or

  • negate

5.方法引用 

推荐用法:快捷键

我们在使用lambda时,如果方法体只有一个方法的调用的话(包括构造方法)。可以使用方法引用

类名或者对象名:方法名

5.1 语法详解

5.1.1 引用类的静态方法

格式:类名::方法名

5.1.2 引用对象的实例方法

6.高级用法

基本数据类型优化
并行流 

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

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

相关文章

SDL线程

文章目录 SDL线程相关 SDL线程相关 SDL线程创建&#xff1a;SDL_CreateThreadSDL线程等待: SDL_WaitThreadSDL互斥锁 :SDL_CreateMutex/SDL_DestoryMutexSDL锁定互斥: SDL_LockMutex/SDL_UnlockMutexSDL条件变量:SDL_CreateCond/SDL_DestoryCondSDL条件变量 等待通知: SDL_Con…

【初阶数据结构与算法】线性表之链表的分类以及双链表的定义与实现

文章目录 一、链表的分类二、双链表的实现1.双链表结构的定义2.双链表的初始化和销毁初始化函数1初始化函数2销毁函数 3.双链表的打印以及节点的申请打印函数节点的申请 4.双链表的头插和尾插头插函数尾插函数 5.双链表的查找和判空查找函数判空函数 6.双链表的头删和尾删头删函…

深 度 学 习

神经网络基础 一、逻辑回归( Logic Regression ) 1 问题的模型 模型&#xff1a; 其中xx为输入量&#xff0c;y^​预测量&#xff0c;σ()激活函数。   逻辑回归主要用于二分类问题的拟合&#xff1a;0≤y^P(y1∣x)≤1&#xff0c;σ(z)如图&#xff1a; ​ 问题&#xff…

【Leecode】Leecode刷题之路第46天之全排列

题目出处 46-全排列-题目出处 题目描述 个人解法 思路&#xff1a; todo代码示例&#xff1a;&#xff08;Java&#xff09; todo复杂度分析 todo官方解法 46-全排列-官方解法 预备知识 回溯法&#xff1a;一种通过探索所有可能的候选解来找出所有的解的算法。如果候选解…

解线性方程组(二)

实验类型&#xff1a;●验证性实验 ○综合性实验 ○设计性实验 实验目的&#xff1a;进一步熟练掌握用Jacobi迭代法和Gauss-Seidel法解线性方程组的算法&#xff0c;提高编程能力和解算线性方程组问题的实践技能。 实验内容&#xff1a; 1)取初值性x(0)(0,0,0,0)T, 精度要求ε…

ReactPress系列—NestJS 服务端开发流程简介

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;感谢Star。 NestJS 服务端开发流程简介 NestJS 是一个用于构建高效、可靠和可扩展的服务器端应用程序的框架。它使用 TypeScript&#xff08;但也支持纯 Java…

ImportError: cannot import name ‘packaging‘ from ‘pkg_resources‘ 的参考解决方法

文章目录 写在前面一、问题描述二、解决方法参考链接 写在前面 自己的测试环境&#xff1a; Ubuntu20.04 ROS-Noetic 一、问题描述 自己在通过 pip install 安装module时 &#xff08;使用的是 pip install mmcv&#xff09;遇到如下问题&#xff1a; ImportError: cannot …

运维人员必备的 Mac Zsh 配置技巧

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Flume学习

一、Flume概述 Flume最主要的作用就是&#xff0c;实时读取服务器本地磁盘的数据&#xff0c;将数据写入到HDFS。 二、Flume基础架构 三、Flume安装部署 配置Flume的前提是要配置好JDK和Hadoop 1.解压 [rootlxm148 soft]# tar -zxvf ./apache-flume-1.9.0-bin.tar.gz -C /…

FBX福币交易所多只高位股重挫,聚星科技首日高开348%

查查配分析11月11日电 周一,A股三大指数集体低开,沪指低开0.58%,深成指低开0.67%,创业板指低开0.99%。 FBX福币凭借用户友好的界面和对透明度的承诺,迅速在加密货币市场中崭露头角,成为广大用户信赖的平台。 Wind截图 券商股明显回调,大消费普遍走低,乳业、白酒、文旅板块跌幅…

基于matlab的人眼开度识别

我国已经成为世界汽车生产和制造大国&#xff0c;道路车辆的不断增加道路基础设施不断增强&#xff0c;但是随之而来的问题也日益严重&#xff0c;比如交通事故&#xff0c;噪声大气污染等。汽车行驶的安全性由于关乎人民生命安全&#xff0c;所以日益受到各国政府以及研究机构…

【数据分享】2024年我国省市县三级的生活服务设施数量(46类设施/Excel/Shp格式)

人才市场、售票处、旅行社等生活服务设施的配置情况是一个城市公共基础设施完善程度的重要体现&#xff0c;一个城市生活服务设施种类越丰富&#xff0c;数量越多&#xff0c;通常能表示这个城市的公共服务水平越高&#xff01; 本次我们为大家带来的是我国各省份、各地级市、…

Node.js——fs模块-文件夹操作

1、借助Node.js的能力&#xff0c;我们可以对文件夹进行创建、读取、删除等操作 2、方法 方法 说明 mkdir/mkdirSync 创建文件夹 readdir/readdirSync 读取文件夹 rmdir/rmdirSync 删除文件夹 3、语法 其余的方法语法类似 本文的分享到此结束&#xff0c;欢迎大家评论区…

C++builder中的人工智能(21):Barabási–Albert model(BA)模型

在此之前&#xff0c;大多数网络被想当然的认为是随机的&#xff0c;因此连接度分布可以近似用泊松分布来表示&#xff0c;而巴拉巴西与其学生阿尔伯特、郑浩雄通过对万维网度分布测量的结果却显示万维网度分布服从幂律分布&#xff0c;存在枢纽节点&#xff08;拥有大量链接的…

ReactPress 安装指南:从 MySQL 安装到项目启动

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎Star。 ReactPress 是一个基于 React 的开源发布平台&#xff0c;适用于搭建博客、网站或内容管理系统&#xff08;CMS&#xff09;。本文将详细介绍如何安装 ReactPress&#xff0c;包括…

从0开始深度学习(25)——多输入多输出通道

之前我们都只研究了一个通道的情况&#xff08;二值图、灰度图&#xff09;&#xff0c;但实际情况中很多是彩色图像&#xff0c;即有标准的RGB三通道图片&#xff0c;本节将更深入地研究具有多输入和多输出通道的卷积核。 1 多输入通道 当输入包含多个通道时&#xff0c;需要…

【C++笔记】C++三大特性之继承

【C笔记】C三大特性之继承 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;C笔记 文章目录 【C笔记】C三大特性之继承前言一.继承的概念及定义1.1 继承的概念1.2继承的定义1.3继承基类成员访问方式的变化1.4继承类模板 二.基类和派生类间的转…

【Unity】Game Framework框架学习使用

前言 之前用过一段时间的Game Framework框架&#xff0c;后来有那么一段时间都做定制小软件&#xff0c;框架就没再怎么使用了。 现在要做大型项目了&#xff0c;感觉还是用框架好一些。于是又把Game Framework拾起来了。 这篇文章主要是讲Game Framework这个框架是怎么用的…

Ubuntu 22 安装 Apache Doris 3.0.3 笔记

Ubuntu 22 安装 Apache Doris 3.0.3 笔记 1. 环境准备 Doris 需要 Java 17 作为运行环境&#xff0c;所以首先需要安装 Java 17。 sudo apt-get install openjdk-17-jdk -y sudo update-alternatives --config java在安装 Java 17 后&#xff0c;可以通过 sudo update-alter…

【Web前端】从回调到现代Promise与Async/Await

异步编程是一种让程序能够在等待某些操作完成的同时继续执行其他任务的关键技术&#xff0c;打破了传统编程中顺序执行代码的束缚。这种编程范式允许开发者构建出能够即时响应用户操作、高效处理网络请求和资源加载的应用程序。通过异步编程&#xff0c;JavaScript 能够在执行耗…