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学习相关推荐

  1. Java8新特性学习_001_(Lambda表达式,函数式接口,方法引用,Stream类,Optional类)

    目录 ■代码 ■代码运行结果 ■代码说明 ・44行:Stream的.foreach方法ー参数类型:函数式接口 ・82行:Interface中,default方法 ・92行   Stream的.max方 ...

  2. Java8新特性学习笔记

    Java8新特性学习笔记 文章目录 Java8新特性学习笔记 一.接口和日期处理 1.接口增强 1.1.JDK8以前 VS JDK8 1)接口定义: 1.2.默认方法(default) 1)默认方法格 ...

  3. 超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!

    之前写过很多次关于Java学习指南.Java技术路线图的文章.但是总还是有小伙伴来问我,Java怎么学,项目怎么做,资源怎么找,真是让人头秃. 于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来, ...

  4. 深度学习 免费课程_深入学习深度学习,提供15项免费在线课程

    深度学习 免费课程 by David Venturi 大卫·文图里(David Venturi) 深入学习深度学习,提供15项免费在线课程 (Dive into Deep Learning with ...

  5. vs2010 学习Silverlight学习笔记(7):控件样式与模板

    概要: 终于知道Silverlight--App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版...好强大的功能啊. 封装: 继续学习<一步一步学Silverl ...

  6. 与 Linux 一起学习:学习打字

    "与 Linux 一起学习"的所有文章: 与 Linux 一起学习:学习打字 与 Linux 一起学习:学习物理 与 Linux 一起学习:学习音乐 与 Linux 一起学习:学习 ...

  7. 还只看花书,西瓜书?一文告诉你如何正确学习深度学习,从理论到实战。

    如今春招已接近尾声,大家都知道今年就业形势整体不乐观,不仅应聘人数远远大于招聘岗位,而且面试难度加大,想拿到理想的offer更是难上加难! 这段时间,很多人都在自我充电,我也经常在后台给读者解答很多深 ...

  8. 最新版动手学习深度学习和GAN电子书免费下载!

    今天给大家推荐一个GAN方面的优质公众号---机器学习与生成对抗网络.该公众号里分享了几本深度学习.GAN等好的电子书资源! 强烈推荐李沐等人的<动手学习深度学习>最新版!完整中文版 PD ...

  9. 2020人工智能课程超级大列表:深度学习-强化学习-图神经网络-自然语言处理等...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 本篇博文主要为大家介绍一个课程网站,汇集了机器学习,深度学习.强化学习的各个方面, ...

最新文章

  1. 机器学习(4)特征预处理
  2. R语言对dataframe的行数据进行排序(Ordering rows)实战:使用R原生方法、data.table、dplyr等方案
  3. SVN被锁定的几种解决方法
  4. pip安装 tensorflow-gpu 提示Could not install packages due to an EnvironmentError: [WinError 5] 拒绝访问
  5. 三网齐发 HTC One行货确定4月24日发布
  6. php分页怎么实行跳转,php分页函数,支持页码下拉选择跳转
  7. 【CV】使用Keras和迁移学习从人脸图像中预测体重指数BMI
  8. .net 调用url接口_.NetCore中Quartz.NET的依赖注入
  9. Spark _23 _读取parquet文件创建DataFrame(二)
  10. 如何下载SAP Cloud for Customer UI技术模型的XML源代码到本地
  11. 如何在backoffice里创建Hybris image container以及分配给product
  12. html输入完账号密码才能跳转,HTML输入字段跳转
  13. leetcode 773. 滑动谜题
  14. JAVA程序员必看的15本书
  15. Spring常用注解,自动扫描装配Bean
  16. Codeforces 500D. New Year Santa Network
  17. 392高校毕业设计选题
  18. linux gcc配置安装文件失败,安装一些环境时提示安装不成功帮一下看看什么情况(apt-get install gcc g++ ssh...
  19. Web端与移动端接入萤石云平台的视频数据
  20. 机器学习知识点全面总结

热门文章

  1. 12、Java Swing计算器界面的实现
  2. 1、MySQL约束概述
  3. Java多线程的实现方式-Thread 类,Runnable 接口
  4. Servlet实现的个人所得税计算器
  5. python爬取快代理IP并测试IP的可用性
  6. HDU 1009 - FatMouse' Trade (部分背包问题)
  7. 2021暑假每日一题 【week3 完结】
  8. 在2008 server上部署域
  9. Spring boot默认日志配置
  10. 北京计算机在职研究生双证学校,北京在职研究生目前有哪些学校开设了双证专业?...