多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);}复制代码
这样就是限制接口里面只能有一个抽象方法了。这个就叫函数式接口。当我们再继续往里面加的话,就会报错了:
其实大多数情况下,我们不需要自己写函数式接口。因为 Java 已经内置了四种常见的函数式接口。
这四个接口需要一般与 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 函数接口一起使用。
不想看文字,还有图片
该方法可以过滤出特定元素并且返回原来的类型。举一个例子
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 函数接口一起使用。
不想看文字,还有图片
该方法可以将原来的集合进行修改,包括返回类型,然后返回一个新的集合。举一个例子
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]]
多stream_基础之Lambda和Stream的邂逅相关推荐
- JAVA基础知识|lambda与stream
lambda与stream是java8中比较重要两个新特性,lambda表达式采用一种简洁的语法定义代码块,允许我们将行为传递到函数中.之前我们想将行为传递到函数中,仅有的选择是使用匿名内部类,现在我 ...
- Java基础 之 lambda、stream概念及实际使用举例
lambda 什么是lambda 函数式编程,将代码块作为参数传入方法,用更简洁的方法创建一个函数式接口的实例. 什么是函数式接口 一个有且只含有一个抽象方法的接口(可以有多个默认方法). 举个栗子: ...
- Java基础学习Lambda与Stream(续)
/* 中间操作 : 映射 -> 将stream操作的每个元素转换成另外一个种形式|提取信息 <R> Stream<R> map(Function& ...
- java peek函数_基础篇:JAVA.Stream函数,优雅的数据流操作
写在开头:本文是转载于掘金上的一篇文章,已获得原作者授权,我会在文章最后放上原作者和原文链接. 前言 平时操作集合数据,我们一般都是for或者iterator去遍历,不是很好看.java提供了Stre ...
- java基础之lambda表达式
java基础之lambda表达式 1 什么是lambda表达式 lambda表达式是一个匿名函数,允许将一个函数作为另外一个函数的参数,将函数作为参数传递(可理解为一段传递的代码). 2 为什么要用l ...
- lambda表达式——Stream管道流的map操作
lambda表达式--Stream管道流的map操作 一.回顾Stream管道流map的基础用法 二.处理非字符串类型集合元素 三.再复杂一点:处理对象数据格式转换 四.flatMap 一.回顾Str ...
- Java8新特性 Lambda、Stream、Optional实现原理
Java8新特性 Lambda.Stream.Optional实现原理 一.接口中默认方法修饰为普通方法 二.Lambda表达式 2.1.什么是Lambda表达式 2.2.为什么要使用Lambda表达 ...
- 万字详解,JDK1.8新特性的Lambda、Stream和日期的使用详解
前言 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程,新的 JavaScr ...
- 万字详解,JDK1.8的Lambda、Stream和日期的使用详解
点击上方 好好学java ,选择 星标 公众号 重磅资讯.干货,第一时间送达今日推荐:2020年7月程序员工资统计,平均14357元,又跌了,扎心个人原创100W+访问量博客:点击前往,查看更多 本文 ...
最新文章
- python随机补边缘border
- Revising the Select Query I(单表查询)
- WindowsPE 第五章 导出表编程-1(枚举导出表)
- 微信小程序 获取用户信息 官网例程 详解
- 完美解决tomcat/springboot启动速度相当慢 快死的状态了
- python调用c代码
- python判断字母数字_Python判断字符串是否为字母或者数字(浮点数)的多种方法
- SSM整合——实现图书的查询功能
- 80. Session
- 端到端车道线检测_弱监督对象检测-端到端培训管道
- PADS2007_教程之PADS LAYOUT
- wps里面函数怎么使用_wps表格函数及函数简单使用
- GLES3.0中文API-glMemoryBarrier
- note GAN model
- 2019中国信息安全自主可控行业政策盘点及网络安全行业分析
- Qt QLineEdit单行输入框用法详解
- 4G模块(BC76)
- bilibili账号申诉中心_B站的申诉渠道究竟在哪啊
- 数据库技术:关系型数据库设计总结
- 云集微店怎么做 我的第一份生意经
热门文章
- Unity(一)Unity脚本程序开发
- 小甲鱼 OllyDbg 教程系列 (十) : Windows 逆向常用 api 以及 XOFTSPY 逆向
- 《深度探索C++对象模型(Inside The C++ Object Model )》学习笔记
- 自动分页,返回时跳回指定页
- 10停止nginx命令 win_Linux下配置Nginx并使用https协议
- mysql load data infile 导入数据 某一列 空_Sql数据挑战赛amp;网络销售案例分析
- 【读书笔记】--- 《码出高效:java开发手册》
- HashMap源码解释
- java 3位小数_数字有效小数第三位四舍五入
- java php html,java和html的区别是什么