JDK8新特性:Stream

Stream

认识Stream

  • 也叫Stream流,是jdk8开始新增的一套API(java.util.stream.*),可以用于操作集合或者数组的数据。
  • 优势:Stream流大量的结合了Lambda的语法风格来编程,提供了一种更强大,更加简单的方式操作集合或者数组中的数据,代码更简洁,可读性更好

案例:体验Stream

需求:

  • 把集合 中所有以“张”开头,且是3个字的元素存储到一个新的集合。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {List<String> names = new ArrayList<>();Collections.addAll(names,"张三丰","张无忌","周芷若","赵敏","张强");System.out.println(names);List<String> list = names.stream().filter(s -> s.startsWith("张")).filter(a -> a.length()==3).collect(Collectors.toList());System.out.println(list);}
}

Stream流的使用步骤

常用方法 

1.获取Stream流

  • 获取集合的Stream流
Collection提供的如下方法说明
default Stream<E> stream()获取当前集合对象的Stream流
  • 获取数组的Stream流

 

2.Stream流常见的中间方法

  • 中间方法指的是调用完成后会返回新的Stream流,可以继续使用(支持链式编程)。
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.stream.Stream;public class Test {public static void main(String[] args) {List<Double> scores = new ArrayList<>();Collections.addAll(scores,88.5,100.0,60.0,99.0,9.5,99.6,25.0);// 需求1:找出成绩大于60分的数据,并升序后输出scores.stream().filter(s -> s >= 60).sorted().forEach(s -> System.out.println(s));List<Student> students = new ArrayList<>();Student s1 = new Student("张三",26,172.5);Student s2 = new Student("张三",26,172.5);Student s3 = new Student("李四",23,167.6);Student s4 = new Student("王五",25,183.5);Student s5 = new Student("赵六",35,167.0);Collections.addAll(students,s1,s2,s3,s4,s5);//需求2:找出年龄大于等于23,且年龄小于等于30岁的学生,并按照年龄降序排序students.stream().filter(s -> s.getAge()>=23 && s.getAge()<=30).sorted((o1, o2) -> o2.getAge() - o1.getAge()).forEach(s -> System.out.println(s));//需求3:取出身高最高的前3名学生,并输出students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(),o1.getHeight())).limit(3).forEach(s -> System.out.println(s));//需求4:取出身高倒数的2名学生,并输出students.stream().sorted((o1, o2) -> Double.compare(o2.getHeight(),o1.getHeight())).skip(students.size() - 2).forEach(s -> System.out.println(s));//需求5:找出身高超过168的学生叫说明名字,要求去除重复的名字,再输出students.stream().filter(s -> s.getHeight() > 168).map(Student::getName).distinct().forEach(s -> System.out.println(s));// distinct去重复,自定义类型的对象(希望内容一样就认为重复,重写hashCode,equals)students.stream().filter(s -> s.getHeight() >168).distinct().forEach(System.out::println);// 合并流Stream<String> str1 = Stream.of("张三","李四");Stream<String> str2 = Stream.of("王五","赵六");Stream<String> allStr = Stream.concat(str1,str2);allStr.forEach(s -> System.out.println());}
}

 

3.Stream流常见的终结方法

  • 终结方法指的是调用完成后,不会返回新的Stream了,没法继续使用流了。
  • 收集Stream流:就是把Stream流操作后的结果转回到集合或者数组中去返回
  • Stream流:方便操作集合/数组的手段;集合/数组:才是开发中的目的 

 

import java.util.*;
import java.util.stream.Collectors;public class Test {public static void main(String[] args) {List<Student> students = new ArrayList<>();Student s1 = new Student("张三",26,172.5);Student s2 = new Student("张三",26,172.5);Student s3 = new Student("李四",23,167.6);Student s4 = new Student("王五",25,183.5);Student s5 = new Student("赵六",35,167.0);Collections.addAll(students,s1,s2,s3,s4,s5);// 需求1:请计算出身高超过168的学生有几人long size = students.stream().filter(s -> s.getHeight() > 168).count();System.out.println(size);// 需求2:找出身高最高的学生,并输出Student s = students.stream().max((o1, o2) -> Double.compare(o1.getHeight(),o2.getHeight())).get();System.out.println(s);// 需求3:找出身高最高的学生,并输出Student ss = students.stream().min((o1, o2) -> Double.compare(o1.getHeight(),o2.getHeight())).get();System.out.println(ss);// 需求4:找出身高超过170的学生对象,并放到一个新的集合中去//流只能收集一次List<Student> students1 = students.stream().filter(a ->a.getHeight() > 170).collect(Collectors.toList());System.out.println(students1);Set<Student> students2 = students.stream().filter(a -> a.getHeight() > 170).collect(Collectors.toSet());System.out.println(students2);// 需求5:找出身高超过170的学生对象,并把学生对象的名字和身高,存入到一个Map集合返回Map<String,Double> map =students.stream().filter(a -> a.getHeight() > 170).distinct().collect(Collectors.toMap(a -> a.getName(),a -> a.getHeight()));System.out.println(map);Student[] arr = students.stream().filter(a -> a.getHeight() > 170).toArray(len -> new Student[len]);System.out.println(Arrays.toString(arr));}
}

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

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

相关文章

微信小程序-04

rpx&#xff08;responsive pixel&#xff09;是微信小程序独有的&#xff0c;用来解决屏适配的尺寸单位。 import 后跟需要导入的外联样式表的相对路径&#xff0c;用 ; 表示语句结束。 定义在 app.wxss 中的样式为全局样式&#xff0c;作用于每一个页面。 在页面的 .wxss 文…

P1045 [NOIP2003 普及组] 麦森数题解

题目 形如的素数称为麦森数&#xff0c;这时P一定也是个素数。但反过来不一定&#xff0c;即如果P是个素数&#xff0c;不一定也是素数。到1998年底&#xff0c;人们已找到了37个麦森数。最大的一个是P3021377&#xff0c;它有909526位。麦森数有许多重要应用&#xff0c;它与…

[网鼎杯 2018]Fakebook1

join一个用户后&#xff0c;点进去发现是这样的 查看这个页面的源代码&#xff0c;发现一个base64编码后的字串 decode之后就是我们join新用户时填入的blog网址 那我们是不是可以通过填入存储flag的地址&#xff0c;从而回显出来呢&#xff1f;当然&#xff0c;先按照常规sqli…

python学习20

前言&#xff1a;相信看到这篇文章的小伙伴都或多或少有一些编程基础&#xff0c;懂得一些linux的基本命令了吧&#xff0c;本篇文章将带领大家服务器如何部署一个使用django框架开发的一个网站进行云服务器端的部署。 文章使用到的的工具 Python&#xff1a;一种编程语言&…

flask_apscheduler源码分析

前言 遵循flask框架的标准的库&#xff0c;称为flask扩展&#xff0c;flask_apscheduler模块就是一个flask扩展&#xff0c;它使用了flask编程上下文&#xff0c;同时内部完全依赖apscheduler。 我近期使用flask_apscheduler遇到了一个所有job全部死亡的bug。现象&#xff1a;j…

【Linux工具篇】Linux项目自动化构建工具make/Makefile

目录 背景 make/makefile怎样完成项目 完成原理 依赖关系 依赖方法 项目清理 执行顺序 Q1&#xff1a;makefile对最新可执行程序不会默认重新生成 Q2&#xff1a;Q1是怎样做到的 规范的makefile 背景 会不会写makefile&#xff0c;从一个侧面说明了一个人是否具备完成…

搜狐新闻客户端使用Kotlin之后对JSON解析框架的探索

本文字数&#xff1a;7488字 预计阅读时间&#xff1a;45分钟 01 引言 自2017年Google发布Kotlin语言之后&#xff0c;Android开发由原来的Java开始向Kotlin过度&#xff0c;目前绝大部分Android开发岗位基本要求就是熟练使用Kotlin。事实上&#xff0c;很多有着多年历史的项目…

Qt使用中文字符串乱码的问题

文章目录 vs编译器下第一种解决方式第二种解决方式 Qt编译器下 我们在使用qt的时候有时候会遇到打印中文字符串的时候出现中文乱码的问题&#xff0c;主要是由于Qt的QString字符串存储的方式是使用utf-8的编码方式&#xff0c;如果我们本地的文件是使用GBK方式的编码再使用中文…

osgEarth真HelloWorld

osgEarth真HelloWorld vcpkg installtests vcpkg install osgEarth安装指南 https://docs.osgearth.org/en/latest/install.html&#xff0c; 预先设置ports/osg/portfile.cmake GL3 否则调用osg相关功能时会出现如下提示 OpenSceneGraph does not define OSG_GL3_AVAILABLE; …

Factor Transfer(NeurIPS 2018)

paper&#xff1a;Paraphrasing Complex Network: Network Compression via Factor Transfer official implementation&#xff1a;https://github.com/Jangho-Kim/Factor-Transfer-pytorch 背景 尽管现有的知识蒸馏方法如KD、FitNet等带来了性能的改善&#xff0c;但直接传…

element plus使用问题

文章目录 element plusvue.config.js注意1、有时候会报错 not a function2、使用 ElMessage 报错3、 element plus 版本过高4、警告Feature flag VUE_PROD_HYDRATION_MISMATCH_DETAILS is not explicitly defined.5、报错 ResizeObserver loop completed with undelivered noti…

如何监控两台android设备之间串口通讯的ADB日志?

如果你的目标是将设备通过 Wi-Fi 连接到计算机&#xff0c;可以执行以下步骤&#xff1a; 一.通过 USB 连接设备&#xff1a; adb devices 确保设备通过 USB 连接&#xff0c;并且可以通过 adb devices 命令正常识别。 二、将设备1和设备2都切换到 TCP/IP 模式&#xff1a;…