多stream_基础之Lambda和Stream的邂逅

基础之Lambda和Stream的邂逅

show me the code and take to me,做的出来更要说的明白
GitHub项目JavaHouse同步收录
喜欢就点个赞呗! 你的支持是我分享的动力!

引入

是否有遇到看不懂身边同事代码的情况,是否有被面试官问到 Java 新特性不懂的情况。我掐指一算你大概是遇到的了 Lambda 表达式 和 Stream 流。为了解决上述情况,我特地献上一份关于 Lambda 和 Stream 的指南,以解燃煤之急。

Lambda

普通调用

首先我们先看第一个例子。

@Testpublic void test(){        test1(1);    }private void test1(int a){    System.out.println(a);}复制代码

运行Test,输出结果

1复制代码

相信这里大家都很清楚,我不需要多废话!

内部类调用

那我们在来看看第二个例子

public interface IPerson {    void personMethod();}private void test2(IPerson person){        person.personMethod();    }@Testpublic void test2(){    test2(new IPerson(){        @Override        public void personMethod() {            System.out.println(1);        }    });}复制代码

运行Test,输出结果

1复制代码

这里的话我将参变成了一个接口,使用了内部类。大家是不是觉得这种形式的代码不容易看清楚,一个参数竟然放了这么多东西,真是让人头大啊。所以我们有了 Lambda 表达式。

Lambda 重构

我们使用 Lambda 表达式重写上面代码。得到下面新代码:

public interface IPerson {    void personMethod();}private void test2(IPerson person){        person.personMethod();    }@Testpublic void test2(){    test2(() -> System.out.println(1));}复制代码

运行Test,输出结果

1复制代码

这样的代码是不是比使用内部类代码优雅了很多,看起来舒服极了,关键代码也少了。这就是 Lambda 表达式的魅力。

Lambda 调用

好了,经过上面的层层递进的例子,我们引出了 Lambda 表达式。现在我们开始了解 Lambda 表达式的语法。

语法:

-> 复制代码

是的,他的调用语法就是一个箭头。当然这样说的话我也不太信。其实还没说完。

当我们的方法没有参数的时候,没有返回,他需要保留括号,形式如下:

() -> System.out.println(1);复制代码

当有一个参数的时候,没有返回,小括号可以去掉,形式如下

a -> System.out.println(a)复制代码

当有多个参数的时候以及方法里面的语法多余一行的时候,没有返回,,形式如下:

(a, b) -> {            System.out.println(a);            System.out.println(b);        }复制代码

上面例子都是没有返回的,那么有返回又是怎样的呢?形式如下:

a -> {            System.out.println(a);            return a;        }复制代码

是的,那就加一下返回啊。

函数式接口

其实上面都是展示如果去调用,不知道你们是否发现后者感觉到,他没有方法名就去调用了,是不是接受不了。这是正常情况。因为我们调用的接口里面这有一个方法,所以我们只需要一个 ->就可以调用到接口里面方法。

所以我们如果想自己写一个 Lambda 的话。只需要在接口里面写一个抽象方法即可。举了例子:

public interface IPerson {    int personMethod(int a);}复制代码

当然我建议加一个注解@FunctionalInterface,形式如下:

@FunctionalInterfacepublic interface IPerson {    int personMethod(int a);}复制代码

这样就是限制接口里面只能有一个抽象方法了。这个就叫函数式接口。当我们再继续往里面加的话,就会报错了:

2dbf6e36816757bf9840c6483a4feede.png

其实大多数情况下,我们不需要自己写函数式接口。因为 Java 已经内置了四种常见的函数式接口。

e92202a6db927c08cabfb61feeca2e47.png

这四个接口需要一般与 Stream 一起使用。

Stream

普通迭代

我们直接看代码,一个普通的迭代例子

public class StreamTest {     @Test    public void test2(){        List list = Arrays.asList(1, 2, 3, 4, 5);        int count = 0;        for (Object o : list){            count ++;        }        System.out.println(count);    }}复制代码

运行Test,输出结果

5复制代码

在 Java8 之前,我们统计 list 的大小是上面的形式。

Stream 重构

现在我们用 Stream 重构上面的代码

public class StreamTest {    @Test    public void test3(){        List list = Arrays.asList(1, 2, 3, 4, 5);        long count = list.stream().count();        System.out.println(count);    }}复制代码

运行Test,输出结果

5复制代码

瞬间感觉代码清爽了很多,变得优雅了,关键代码也少了。这就是 Stream 的魅力。

经过上面的例子,我们可以感觉到 Stream 可以代替 for 循环,进行特定操作。注意这里是特定的操作,因为 Stream 接口里面只有只封了几个方法。

collect()

collect() 方法可以将 Stream 变成 List等集合形式。

我们看一个例子:

public class StreamTest {    @Test    public void test4(){        Stream stream = Stream.of(1, 2, 3, 4, 5,1);        List collect = stream.collect(Collectors.toList());        }}复制代码

fiter()

fiter() 方法与 Predicate 函数接口一起使用。

f54e4bb40eeb1e4ca1c4a917dfdbaa40.png

不想看文字,还有图片

cda87bef27afdd2b13f4671928a032bf.png

该方法可以过滤出特定元素并且返回原来的类型。举一个例子

public class StreamTest {    @Test    public void test5(){        Stream stream = Stream.of(1, 2, 3, 4, 5,1);        List collect = stream.filter(a -> a > 3).collect(Collectors.toList());        System.out.println(Arrays.asList(collect));    }}复制代码

运行Test,输出结果

[[4, 5]]复制代码

map()

map() 方法与 Function 函数接口一起使用。

aa80f2f3d9b18ea84559fa38a830b4f8.png

不想看文字,还有图片

a01a3e772def744050e294e585974864.png

该方法可以将原来的集合进行修改,包括返回类型,然后返回一个新的集合。举一个例子

public class StreamTest {   @Test    public void test8(){        Stream stream = Stream.of(1, 2, 3, 4, 5,1);        List collect = stream.map(a -> a = 1).collect(Collectors.toList());//        List collect = stream.map(a -> a == 1).collect(Collectors.toList());        System.out.println(Arrays.asList(collect));    }}复制代码

运行Test,输出结果

[[1, 1, 1, 1, 1, 1]]复制代码

我们可以看到两种情况 Integer -> Integer 以及 Integer -> Boolean

注意我们不能操作同一个 stream 两次,不然会报错,有兴趣可以试试。

distinct()

该方法意如其字,就是去重。代码如下

public class StreamTest {    @Test    public void test7(){        Stream stream = Stream.of(1, 2, 3, 4, 5,1);        List collect = stream.distinct().collect(Collectors.toList());        System.out.println(Arrays.asList(collect));    }}复制代码

运行Test,输出结果

[[1, 2, 3, 4, 5]]

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

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

相关文章

注意力机制--转载自我的学生隆兴写的博客

原文链接为:https://a-egoist.com/posts/a44b8419/,学生自己搭建的博客,点赞! 1 Attention 1.1 什么是 Attention 灵长类动物的视觉系统中的视神经接受了大量的感官输入。在检查视觉场景时,我们的视觉神经系统大约每…

python正弦波和等腰三角波_正弦波脉宽调制(SPWM)原理

1、QPWM的概念 在进行脉宽调制时,使脉冲系列的占空比按正弦规律来安排。当正弦值为最大值时,脉冲的宽度也最大,而脉冲间的间隔则最小,反之,当正弦值较小时,脉冲的宽度也小,而脉冲间的间隔则较大…

推荐系统--矩阵分解(1)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 1 引入 一个矩阵可以分解为两个小矩阵的乘积,以音乐为例,利用潜在特征向量来给用户和音乐打上标签&#xff…

python dag调度系统开发_基于机器学习的DAG调度平台

什么是DAG?有向无环图树形结构:除根节点,每个节点有且仅有一个上级节点,下级节点不限。根节点没有上级节点。图结构:每个节点上级、下级节点数不限。DAG调度平台的定义及场景任务调度是在各行各业是个基础问题,当任务…

轻量级人脸识别算法

1 概述 轻量级人脸识别算法

python元组与列表的区别、简答题_细解python面试题(一)元组和列表的区别

可能略去了一些内容。1、列表VS元组在python编程中,我们经常搞不懂列表和元组的区别,或者哪些函数可以用于列表,哪些用于元组,那么跟随本文我们来深入的探索。2、元组元组是值的集合,我们用圆括号来申明它。元组中的类…

Yolo家族算法分析

1 历史简介 2 YOLO算法思想 YOLO算法的基本思想: (1)将图片划分为SSS \times SSS个网格; (2)计算每个边界框和置信度; (3)计算每个网格属于某个类别的概率; &…

u8 附件上传后存放路径_织梦DedeCms附件按月份保存的修改方法

正常情况下,dedecms织梦系统的图片附件是按日保存的,一天一个文件夹, 时间长了, 这样在allimg中就会生成很多文件夹, 不方便管理.虽然,dedecms织梦的后台设置有”附件保存形式”的先项, 但功能太弱,如果是在后台上传和…

推荐系统--矩阵分解(2)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 3 BiasSVD:考虑偏置 有一些用户会给出偏高的评分,有一些物品也会收到偏高的评分,比如电影观众为…

tga文件怎么打开_教你win10系统怎么打开stp文件

stp文件怎么打开呢?近来有很多小伙伴反映有朋友发送了一个stp文件给它,搞了半天也没能打开。其实打开stp文件很简单,不过前提是需要有绘图软件。我给大家整理了打开stp文件的图文教程,赶紧来瞧瞧吧有些朋友在使用win10系统的过程中…

python爬取电子病历_一种基于中文电子病历的实体识别方法技术

本发明专利技术提供了一种基于中文电子病历的实体识别方法,涉及医疗实体识别技术领域。针对目前国内缺少公开中文电子病历标注语料库的缺陷,本发明专利技术通过构建整理医学词典,提出了一种半自动语料库标注方法,节省了人工标注的…

推荐系统--矩阵分解(4)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 7 基于情感分析的矩阵分解 7.1 引入 【摘要】推荐系统旨在基于丰富的信息预测用户的偏好,例如用户评分、人口统计和评论…

yarn 卸载包_0609-6.1.0-如何卸载CDH6.1

1.文档编写目的Fayson在两年前的文章中介绍过CDH的卸载,参考《如何卸载CDH(附一键卸载github源码)》。除非你是使用Cloudera官方提供的一键安装脚本安装的CDH,否则并没有现成的一键卸载的脚本供使用。为了更好的理解CDH的卸载,这里再次简单介…

推荐系统--矩阵分解(3)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 5 TimeSVD:增加时间因素 物品的受欢迎度随着时间而改变,例如,电影可以因外部事件(如新电影中演员…

python安装不了是什么问题_安装不上python的模块怎么办?别怕,我这有妙招!

之前我们介绍过如何在Python中安装第三方的包:Python以第三方包丰富而著称,你想要的功能几乎都可以通过pip命令安装,避免什么都要自己重新造轮子尬尴。但是pip安装有两个常见问题,第一是下载慢,第二是无法安装。慢的原…

推荐系统--矩阵分解(5)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 8 基于隐式反馈的矩阵分解 8.1 引入 相对于显示反馈的评分数据,隐式反馈有以下几方面的特征: 只有正反馈&…

xss跨站脚本攻击_网络安全xss跨站脚本攻击原理

以下在未经授权的网站操作均为违法行为XSS跨站脚本攻击xss的危害网络钓鱼,盗取各类账号密码我们先来看一下下面的案例:先来记住一下下面中的表我们来做一个转发上面页面显示已经登录,但是突然页面中提醒再此登录此时,我们并没有多…

推荐系统--联邦学习下的矩阵分解(6)

推荐系统–矩阵分解(1) 推荐系统–矩阵分解(2) 推荐系统–矩阵分解(3) 推荐系统–矩阵分解(4) 推荐系统–矩阵分解(5) 推荐系统–矩阵分解(6) 9 应用于联邦学习的矩阵分解 这个部分主要参考以下两篇论文: 2008-Collaborative Filtering for Implicit Feedback Dat…

python类的特殊方法汇总_Python笔记001-类的特殊方法

Python笔记001-类的特殊方法以下是我学习《流畅的Python》后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者。首次发表于: 微信公众号:科技老丁哥,ID: TechDing,敬请关注。本篇主要知识点:类…

什么是联邦学习

联邦学习 1.1 联邦学习的概念 历史:联邦学习最早在 2016 年由谷歌提出,原本用于解决安卓手机终端用户在本地更新模型的问题; 本质:联邦学习本质上是一种分布式机器学习技术,或机器学习框架。 目标:联邦学…