前言

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;}@Overridepublic 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);}@Overridepublic int hashCode() {return Objects.hash(name, age, score, city);}@Overridepublic 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);

groupingBy

根据城市对学生进行分组

   students.stream().collect(Collectors.groupingBy(Student::getCity)).forEach((k,v)->{System.out.println(k+" = "+v);});

根据城市对学生进行分组,统计每个分组的count

   students.stream().collect(Collectors.groupingBy(Student::getCity,Collectors.counting())).forEach((k,v)->{System.out.println(k+" = "+v);});

统计每个分组的分数平均值

    students.stream().collect(Collectors.groupingBy(Student::getCity,Collectors.averagingInt(Student::getScore))).forEach((k,v)->{System.out.println(k+" = "+v);});

分组之转换分组结果List -> List


students.stream().collect(Collectors.groupingBy(Student::getCity, Collectors.mapping(Student::getName, Collectors.toList()))).forEach((k,v)->{System.out.println(k+" = "+v);});//打印结果
//        合肥 = [stu001, stu001, stu004, stu007]
//        郑州 = [stu002, stu003]
//        杭州 = [stu006, stu008]
//        南京 = [stu005]

自定义key

        students.stream().collect(Collectors.groupingBy(student -> "key_"+student.getCity())).forEach((k,v)->{System.out.println(k+" = "+v);});

java8-常用stream操作(1)相关推荐

  1. Java8中stream()操作toMap()时Duplicate key问题解决

    问题描述: 最近使用Java8中Steam()流进行tomap转换编程时,遇到以下错误 java.lang.IllegalStateException: Duplicate key bbbat jav ...

  2. java8使用stream操作集合类,如何使用bigDicemal计算工资?

    文章目录 1. list集合通过stream转成map 2. map集合通过stream转成新的map 2. 使用bigDicemal计算工资(避免丢失精度) 1. list集合通过stream转成m ...

  3. Java8使用stream操作两个list根据某字段匹配再对其中一个list进行赋值

    import com.google.common.collect.Lists; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.F ...

  4. java8常用stream

    //汇总计算 reduce CxmBiBatchFeeExt ext = new CxmBiBatchFeeExt(); List<DkSaleOrderItem> batchDkSale ...

  5. Java8中Stream流对集合操作

    java8中Stream流引入函数式编程思想,主要配合各种接口.lambda表达式.方法引用等方式,为集合的遍历.过滤.映射等提供非常"优雅"的操作方式. Student.java ...

  6. Java8种Stream流相关操作——集合的筛选、归约、分组、聚合

    过滤.筛选   filter skip /*** 过滤 筛选*/@Testpublic void test2(){List<String> list = Arrays.asList(&qu ...

  7. Java8的Stream中的Collectors操作求double类型和的坑

    Java8的Stream中的Collectors操作求double类型和的坑 无敌踩坑王的我又双叒叕来了!!!!!! 例子: @Testpublic void testSumDouble() {dou ...

  8. java8中 lambda表达式,stream操作

    什么是lambda表达式 概念:Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda ab ...

  9. Java8 stream操作

    这里记录一下java8的stream语法使用 /*** @author fengzp* @date 2017/4/11下午4:49* @email fengzp@gzyitop.com* @compa ...

  10. java8的stream特性_Java8新特性介绍:Stream API

    Stream API 了解Stream Java8中有两个比较大的改变 Lambda表达式 Stream API (java.util.stream.*) Stream是Java8中处理集合的关键抽象 ...

最新文章

  1. spring aop 拦截业务方法,实现权限控制
  2. 转:Eclipse自动补全功能轻松设置
  3. 全球著名 CMS 产品大全
  4. oracle实列关闭,Oracle单实例+ASM启动与关闭
  5. http post请求 参数放在路径后面 java_「思唯网络学院」网络基本概念之HTTP协议...
  6. mysql读书笔记----时间函数
  7. HDU-4027 Can you answer these queries? --线段树
  8. 13--长度最小的子数组
  9. 数据结构基础(12) --双向循环链表的设计与实现
  10. Android 系统性能优化(80)---Android性能优化:这是一份详细的布局优化 指南(含lt;includegt;、lt;Viewstubgt;、lt;mergegt;)
  11. 台达vfd一ⅴe变频说明书_PLC运动控制实例解析:PLC与变频器系统
  12. js 获取相同name元素的属性值
  13. iOS 无证书真机调试
  14. 网络安全界基于知识的识别和映射提出网络空间资源分类明细
  15. 在计算机操作中粘贴的快捷键是什么,复制粘贴的快捷键,详细教您电脑怎么使用快捷键复制粘贴...
  16. 《手把手教你构建自己的 Linux 系统》学习笔记(9)
  17. Winrar 4.0破解
  18. Rviz 实现 pannel 插件
  19. 悖论对计算机科学影响,科学界最著名的几大悖论,你能解释吗?
  20. 桐梓县春晖行动志愿者协会开展同心抗疫志愿服务保障工作

热门文章

  1. java 跳转url_URL跳转的几种方式
  2. linux基本知识点汇集
  3. [算法]算法学习05
  4. JDK安全模块JCE核心Cipher使用详解
  5. CDN 是什么 、CDN 引入
  6. matlab 关键路径函数,用线性规划建模(确定参数)关键路径法
  7. matlab 图片倒影_matlab-画个拱桥和倒影?
  8. 深度学习(十三) Adversarial Attack 理论部分
  9. 服务器上qq邮件不能打开方式,QQ邮箱打不开的处理方法
  10. 利用微信搜索抓取公众号文章(转载)