java8学习_java8学习
Java8 Lambda表达式和Stream学习
lambda表达式和Stream是Java8的新特性,这次分享一下我在学习lambda表达式和Stream的收获。
这是这次测试用的Entity:
public classpeople {privateString name;privateString sex;privateInteger age;
}
这是测试实体类使用的数据:
ArrayList list = new ArrayList<>();for(int i = 0;i < 10 ;i++){
people people2= newpeople();
people2.setName("-----楼下小黑");
people2.setSex("男");
people2.setAge(30-i);
list.add(people2);
}
下面是简单的使用lambda表达式对集合进行的一个简单的排序。
p1和p2是对比的两个people对象,使用对象的年龄字段来进行排序,正序排列,年龄最小的排在集合的第一位。
list.sort((p1,p2) -> p1.getAge().compareTo(p2.getAge()));
还可以和java8中的stream配合使用来对集合进行过滤操作,parallelStream也是流中的一个方法,并行流,将集合转换成流之后,多线程来操作集合,代码中还对集合进行了过滤,年龄大于25岁people对象,并通过foreach输出,labdam表达式foreach结构跟普通的foreach循环结构类似,(parameters) -> expression 或者 (parameters) ->{ statements; } ,
操作时,他会自动判断(parameters)的类型,然后在 -> 来对当前的people对象进行操作,如果集合对象数据量大的话,理论上可以提升效率,但是实际上如果数据量不大,还是循环迭代的效率更快,因为多线程的任务切换占用执行的大部分时间,代码如下:
list.parallelStream().filter(people -> people.getAge()>25).forEach(people -> System.out.println(people));
这段代码输出的对象是年龄大于25岁的 而如果不使用lambda表达式和Stream,我们肯定直接想到的就是For循环来完成这个判断,但是Foreach循环是循环每一个对象然后取年龄来进行判断。而且For循环是封装了迭代的语句块,下面是使用iterator进行迭代的循环。
Iterator iterator =list.iterator();
while(iterator.hasNext()){
people p2 =iterator.next();
if(p2.getAge()>25){
System.out.println(p2);
}
}
整个迭代过程是调用iterator返回一个泛型为people的迭代对象,来控制整个循环的流程,使用hasNext和next来完成迭代;
而java8的Stream是则是通过Stream方法来创建一个Stream对象,然后之后所有的操作都是针对于这个Stream对象,Stream操作的是无序的对象,其中还有parallelStream并行流,可以多线程来操作集合对象在一些集合数据多的情况下来提升效率,而针对Stream的所有操作都是在操作Stream,只有foreach获取结果时才能操作结果,所以这种迭代方式称为内部迭代。
lambda表达和Stream搭配使用,在某些情况下,可以使代码变得更效率,更简洁。
Stream的学习
在前面的例子中,我们对通过Stream集合的操作可以分为三个步骤
获得Stream对象,
Intermediate:通过一系列中间方法,对数据集进行过滤,检索等操作.可能有多次Intermediate操作,
Terminal:最终步骤,完成对结果的操作,如上面例子中的foreach操作中的打印。
Intermediate:
concat:
可以将两个Stream连接在一起,如果是两个泛型不同的Stream也可以合并,但是会返回一个Object的Stream对象:
Stream.concat(Stream.of("1","2"), list.parallelStream()).forEach((obj) -> System.out.println(obj));
控制台输出的是people对象的toString()方法和1,2。
map:
遍历Stream,相当于循环了,可以在遍历每一个元素并且可以进行操作,下面是将每一个peopel对象的年龄乘以2,并输出:
list.stream().map(people -> {people.setAge(people.getAge()*2);return people;}).forEach(people -> System.out.println(people));
distinct:
去掉重复的元素,注意,这里去掉重复不是对象,而是根据内存地址来判断,如果你对象指向的栈或者堆中的地址是相同的,就会去掉重复的对象。
people people1 = new people("楼下小白", "女", 255);
list.add(people1);
list.add(people1);
list.stream().distinct().forEach(people-> System.out.println(people));
max:
可以找出Stream中某个可比值中最大的值。
Optional max = peopleStream.max((p1, p2) -> p1.getAge().compareTo(p2.getAge()));
min:则是将max换成min。
比较常用的就是这几个方法了,其他还有一部分方法就不在这里一一写出了。
还有的是,因为lambda表达式的方法语句看起来很简单,所以变量名字如果可以尽写的剪短一点,列入p1,p2这种,可以让表达式变得更为简洁。
Terminal:
结束操作,将经过中间操作的流结束,获得经过中间操作的结果,最常见的是跟随本次java8一起的更新在集合接口的内部迭代方法foreach方法。
java8学习_java8学习相关推荐
- Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)
目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行 Stream的.max方 ...
- Java8新特性学习笔记
Java8新特性学习笔记 文章目录 Java8新特性学习笔记 一.接口和日期处理 1.接口增强 1.1.JDK8以前 VS JDK8 1)接口定义: 1.2.默认方法(default) 1)默认方法格 ...
- 超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!
之前写过很多次关于Java学习指南.Java技术路线图的文章.但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃. 于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来, ...
- 深度学习 免费课程_深入学习深度学习,提供15项免费在线课程
深度学习 免费课程 by David Venturi 大卫·文图里(David Venturi) 深入学习深度学习,提供15项免费在线课程 (Dive into Deep Learning with ...
- vs2010 学习Silverlight学习笔记(7):控件样式与模板
概要: 终于知道Silverlight--App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版...好强大的功能啊. 封装: 继续学习<一步一步学Silverl ...
- 与 Linux 一起学习:学习打字
"与 Linux 一起学习"的所有文章: 与 Linux 一起学习:学习打字 与 Linux 一起学习:学习物理 与 Linux 一起学习:学习音乐 与 Linux 一起学习:学习 ...
- 还只看花书,西瓜书?一文告诉你如何正确学习深度学习,从理论到实战。
如今春招已接近尾声,大家都知道今年就业形势整体不乐观,不仅应聘人数远远大于招聘岗位,而且面试难度加大,想拿到理想的offer更是难上加难! 这段时间,很多人都在自我充电,我也经常在后台给读者解答很多深 ...
- 最新版动手学习深度学习和GAN电子书免费下载!
今天给大家推荐一个GAN方面的优质公众号---机器学习与生成对抗网络.该公众号里分享了几本深度学习.GAN等好的电子书资源! 强烈推荐李沐等人的<动手学习深度学习>最新版!完整中文版 PD ...
- 2020人工智能课程超级大列表:深度学习-强化学习-图神经网络-自然语言处理等...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 本篇博文主要为大家介绍一个课程网站,汇集了机器学习,深度学习.强化学习的各个方面, ...
最新文章
- 机器学习(4)特征预处理
- R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案
- SVN被锁定的几种解决方法
- pip安装 tensorflow-gpu 提示Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
- 三网齐发 HTC One行货确定4月24日发布
- php分页怎么实行跳转,php分页函数,支持页码下拉选择跳转
- 【CV】使用Keras和迁移学习从人脸图像中预测体重指数BMI
- .net 调用url接口_.NetCore中Quartz.NET的依赖注入
- Spark _23 _读取parquet文件创建DataFrame(二)
- 如何下载SAP Cloud for Customer UI技术模型的XML源代码到本地
- 如何在backoffice里创建Hybris image container以及分配给product
- html输入完账号密码才能跳转,HTML输入字段跳转
- leetcode 773. 滑动谜题
- JAVA程序员必看的15本书
- Spring常用注解,自动扫描装配Bean
- Codeforces 500D. New Year Santa Network
- 392高校毕业设计选题
- linux gcc配置安装文件失败,安装一些环境时提示安装不成功帮一下看看什么情况(apt-get install gcc g++ ssh...
- Web端与移动端接入萤石云平台的视频数据
- 机器学习知识点全面总结