前言

java8的Stream 流式操作,用于对集合进行投影、转换、过滤、排序、去重等,更进一步地说,这些操作能链式串联在一起使用,类似于 SQL 语句,可以大大简化代码。下面我就将平时常用的一些stream操作做一些汇总。

通过 IntStream 构造基本类型的流

        //在java8之前,遍历0-99的基本操作
for(int i = 0;i<100;i++){
System.out.println("i:"+i);
} //使用IntStream串行遍历
IntStream.rangeClosed(0,99).forEach(i->{
System.out.println("i:"+i);
}); //使用IntStream并行遍历
IntStream.rangeClosed(0,99).parallel().forEach(i->{
System.out.println("i:"+i);
});

定义一个学生的结构体,为后续操作做准备

class Student{
private String name;
private int age;
private int score;
private String city; public Student(String name, int age, int score, String city) {
this.name = name;
this.age = age;
this.score = score;
this.city = city;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public int getScore() {
return score;
} public void setScore(int score) {
this.score = score;
} public String getCity() {
return city;
} public void setCity(String city) {
this.city = city;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return age == student.age &&
score == student.score &&
Objects.equals(name, student.name) &&
Objects.equals(city, student.city);
} @Override
public int hashCode() {
return Objects.hash(name, age, score, city);
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
", score=" + score +
", city='" + city + '\'' +
'}';
}
} //构造数据
List<Student> students = new ArrayList<>();
students.add(new Student("stu001",18,70,"合肥"));
students.add(new Student("stu001",18,70,"合肥"));
students.add(new Student("stu002",23,80,"郑州"));
students.add(new Student("stu003",45,90,"郑州"));
students.add(new Student("stu004",32,73,"合肥"));
students.add(new Student("stu005",66,76,"南京"));
students.add(new Student("stu006",34,79,"杭州"));
students.add(new Student("stu007",28,90,"合肥"));
students.add(new Student("stu008",19,100,"杭州"));

filter

根据特定的条件进行过滤

//filter 实现过滤操作,这边过滤出年龄大于30的学生
students.stream().filter(s->s.getAge()>30).forEach(System.out::println);

map

元素进行转化

 //map 对流每一个元素进行转化,将student的age转化成流
students.stream().map(Student::getAge).forEach(System.out::println);

sort 排序

根据条件进行排序操作

//sort 按年龄排序,倒序
students.stream().sorted(Comparator.comparing(Student::getAge).reversed()).forEach(System.out::println);

distinct 去重

对流元素进行去重操作

//distinct 去重,因为实现了hashcode和equals,名称为stu001的学生重复了
students.stream().distinct().forEach(System.out::println);

将集合组成一个list

students.stream().map(Student::getAge).collect(Collectors.toList()).forEach(System.out::println);

将集合组成一个set

students.stream().map(Student::getAge).collect(Collectors.toSet()).forEach(System.out::println);

最大值

求出年龄最大的学生

System.out.println(students.stream().max(Comparator.comparingInt(Student::getAge)).get());

最大值

求出年龄最最小的学生

System.out.println(students.stream().min(Comparator.comparingInt(Student::getAge)).get());

join操作

按照逗号进行join,用[]包裹起来

//join操作,姓名join
System.out.println(students.stream().map(Student::getName).collect(Collectors.joining(",","[","]")));

toMap操作

根据指定key,value生成一个map

students.stream().collect(Collectors.toMap(Student::getName,student -> student,(x1,x2)->x2)).entrySet().forEach(System.out::println);

java8-stream常用操作(1)的更多相关文章

  1. Stream常用操作以及原理探索

    Stream常用操作以及原理 Stream是什么? Stream是一个高级迭代器,它不是数据结构,不能存储数据.它可以用来实现内部迭代,内部迭代相比平常的外部迭代,它可以实现并行求值(高效,外部迭代要 ...

  2. JAVA8 Stream集合操作:中间方法和完结方法

    StreamLambda为java8带了闭包,这一特性在集合操作中尤为重要:java8中支持对集合对象的stream进行函数式操作,此外,stream api也被集成进了collection api, ...

  3. Java8 Stream终端操作使用详解

    话不多说,自己挖的坑自己要填完,今天就给大家讲完Java8中Stream的终端操作使用详解.Stream流的终端操作主要有以下几种,我们来一一讲解. forEach() forEachOrdered( ...

  4. Java8 Stream中间操作使用详解

    前面两篇简单的介绍了Stream以及如何创建Stream,本篇就给大家说说stream有哪些用途,以及具体怎样使用. 再次介绍Stream Stream 使用一种类似用于SQL 语句从数据库查询数据的 ...

  5. java8 stream流操作的flatMap(流的扁平化)

    https://mp.weixin.qq.com/s/7Fqb6tAucrl8UmyiY78AXg https://blog.csdn.net/Mark_Chao/article/details/80 ...

  6. Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  7. 【JDK8】Java8 Stream流API常用操作

    Java版本现在已经发布到JDK13了,目前公司还是用的JDK8,还是有必要了解一些JDK8的新特性的,例如优雅判空的Optional类,操作集合的Stream流,函数式编程等等;这里就按操作例举一些 ...

  8. Java8获取当前时间、新的时间日期类如Java8的LocalDate与Date相互转换、ZonedDateTime等常用操作包含多个使用示例、Java8时区ZoneId的使用方法、Java8时间字符串解析成类

     下面将依次介绍 Date转Java8时间类操作 ,Java8时间类LocalDate常用操作(如获得当前日期,两个日期相差多少天,下个星期的日期,下个月第一天等) 解析不同时间字符串成对应的Java ...

  9. Stream流的基本介绍以及在工作中的常用操作(去重、排序以及数学运算等)

    平时工作中,我在处理集合的时候,总是会用到各种流操作,但是往往在处理一些较为复杂的集合时,还是会出现无法灵活运用api的场景,这篇文章的目的,主要是为介绍一些工作中使用流时的常用操作,例如去重.排序和 ...

  10. Java8 Stream 的一些操作和介绍

    原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11858186.html Java8 Stream 是一个新的东西, 就是能够将常见的数据结构转 ...

随机推荐

  1. Go:go程序报错Cannot run program "C:\Users\dell\AppData\Local\Temp\___go_build_hello_go.exe" (in directory "…………"):该版本的 %1 与你运行的 Windows 版本不兼容。

    问题截图 在go语言编译的时候,如果只是单单编译一个文件的话,package必须是main,意味着是可以单独编译的. 解决办法 修改为 package main 就可以 再次运行就可以啦. 文章转载至 ...

  2. 使用 redis 减少 秒杀库存 超卖思路 (转)

      由于数据库查询的及插入的操作 耗费的实际时间要耗费比redis 要多, 导致 多人查询时库存有,但是实际插入数据库时却超卖 redis 会有效的减少相关的延时,对于并发量相对较少的 可以一用 1 ...

  3. JavaScript中使用eval()方法解析json串

    最近在js用到了eval()方法,在这里做个笔记 当时是这么用的:data = eval("("+data+")"); data为后台向前台传送的一个json串 ...

  4. centos安装报错:license information (license not accepted)

    前言:在最近部署的centos系统发现个问题 出现报错:安装配置完成后,重启虚拟机出现license  information  (license not accepted) 截图: 解决方案: 在界 ...

  5. ms17-010 永恒之蓝漏洞复现(CVE-2017-0143)

    0x01 首先对目标机的开放端口进行探测,我们可以使用探测神器nmap 发现开放的445端口,然后进行下一步的ms17-010的漏洞验证 0x02 打开MSF美少妇神器,用search命令搜索ms17 ...

  6. python使用笔记11--时间模块

    1.时间模块常用方法 1 import time,datetime 2 #格式化好的时间2020-05-16 18:30:52 3 #时间戳1589616753 从unix元年(计算机发明的时间)到现 ...

  7. Gitbook配置目录折叠

    如果有多个目录,Gitbook在浏览器上打开时,默认所有的目录都会打开,当目录比较多时,全部显示不利于阅读. 可以使用插件配置目录折叠,使得打开浏览器时这些目录默认是关闭的. 在执行gitbook i ...

  8. Java基础00-网络编程29

    1. 网络编程入门 1.1 网络编程概述 1.2 网络编程三要素 1.3 IP地址 在命令提示符中使用 1.4 InetAddress的使用 代码示例: public class InetAddres ...

  9. 常见最基础的Dos命令.

    打开cmd的方式. 1.+系统+命令提示符 2.Win+R 输入cmd 打开命令台 (推荐使用) 3.在任意的文件夹下按住SHIFT 加鼠标右键 在此处打开命令行窗口 4.资源管理器的地址栏前面加上 ...

  10. Oracle19c 如何用rman duplicate 克隆一个数据库。(Active方式)

    Oracle19c 如何用rman duplicate 克隆一个数据库. 首先克隆有两种方法,一种是Backup-Based,一种是Active方式.官网文档链接https://docs.oracle ...