Stream流有一些特性:
Stream流不是一种数据结构,不保存数据,它只是在原数据集上定义了一组操作。
这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作。
Stream不保存数据,故每个Stream流只能使用一次。

下面进行一些实际操作来作为stream流的学习
首先创建一个Person实例当做对象模板


```java
public class Person {private String name;  // 姓名private int salary; // 薪资 //也可当做人的战斗力private int age; // 年龄private String sex; //性别public Person() {}public Person(String name, int salary, int age,String sex,String area) {this.name = name;this.salary = salary;this.age = age;this.sex = sex;this.area = area;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;Person person = (Person) o;return salary == person.salary && age == person.age && Objects.equals(name, person.name) && Objects.equals(sex, person.sex) && Objects.equals(area, person.area);}@Overridepublic int hashCode() {return Objects.hash(name, salary, age, sex, area);}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getArea() {return area;}public void setArea(String area) {this.area = area;}@Overridepublic String toString() {return "Person{" +"name='" + name + '\'' +", salary=" + salary +", age=" + age +", sex='" + sex + '\'' +", area='" + area + '\'' +'}';}private String area;  // 地区
}
创建一个数据类 用来存储我们创建的对象集合:```java
public class PersonData {public static List<Person> getPersonList(){List<Person> personList = new ArrayList<>();personList.add(new Person("李星云",8900,24,"男","青城山"));personList.add(new Person("姬如雪", 7000,22, "女", "岐国"));personList.add(new Person("女帝", 78000,32, "女", "岐国"));personList.add(new Person("张子凡", 7800,24, "男", "龙虎山"));personList.add(new Person("陆林轩", 7000,21 ,"女", "青城山"));personList.add(new Person("不良帅", 95000, 300,"男", "藏兵谷"));personList.add(new Person("鬼王", 79900,40, "男", "玄冥教"));return personList;}
}

下面以一些问题操作来进行例子的学习:


遍历/匹配(foreach/find/match)

*
*Stream也是支持类似集合的遍历和匹配元素的
* 只是Stream中的元素是以Optional类型存在的
* Stream的遍历、匹配非常简单。
* */****
 List<Integer> list = Arrays.asList(7,6,9,3,8,2,1);@Testpublic void test1(){//遍历输出符合条件的元素list.stream().filter(x->x>6).forEach(System.out::println); //方法引用//匹配第一个Optional<Integer> findFirst = list.stream().filter(x->x>6).findFirst();//匹配任意(适用于并行流)Optional<Integer> findAny = list.parallelStream().filter(x->x>6).findAny();//是否包涵符合条件的元素boolean anyMatch = list.stream().anyMatch(x->x>6);System.out.println("匹配第一个"+findFirst.get());System.out.println("匹配任意一个"+findAny.get());System.out.println("是否存在大于6的值"+anyMatch);System.out.println("打印所有奇数");list.stream().filter(x->x%2!=0).forEach(System.out::println);}

输出结果:

 **/** 筛选(filter)** 筛选 是按照一定的规则校验流中的元素* 将符合条件的元素提取到新的流中的操作。* *///筛选出Integer集合中大于7的元素,并打印出来**@Testpublic void test2(){list.stream().filter(x->x>7).forEach(System.out::println);}

执行结果:

// 筛选员工中工资高于8000的人,并形成新的集合。 形成新集合collect(收集)

  List<Person> personList = PersonData.getPersonList();@Testpublic void test3(){personList.stream().filter(person -> person.getSalary() > 8000).collect(Collectors.toList()).forEach(System.out::println);}

执行结果:

*/

*聚合(max/min/count)

*
* max、min、count在mysql中我们常用它们进行数据统计
* Java stream中也引入了这些概念和用法
* 极大地方便了我们对集合 数组的数据统计工作
* *///*获取String集合中最长的元素***
@Testpublic void test4(){List<String> list =Arrays.asList("asdasd","asd","werwawd","4654654","sadasd55454");System.out.println("字符串最长的元素"+list.stream().max(Comparator.comparing(String::length)));}

执行结果:

/*
*获取Integer集合中的最大值。
* */

 @Testpublic void test5(){Optional<Integer> optional =  list.stream().max(Integer::max);System.out.println("最大值"+optional.get());//自然排序Optional<Integer> optional1 = list.stream().max(Integer::compareTo);//自定义排序Optional<Integer> optional2 = list.stream().max((x1,x2)->x1.compareTo(x2));// 自定义排序Optional<Integer> max2 = list.stream().max(new Comparator<Integer>() {@Overridepublic int compare(Integer o1, Integer o2) {return o1.compareTo(o2);}});System.out.println("自然排序最大值"+optional1.get());System.out.println("自定义排序最大值"+optional2.get());System.out.println("自定义排序2最大值"+max2.get());}

执行结果:

//获取最高的工资

 @Testpublic void test6(){Optional<Person> person = personList.stream().max(Comparator.comparing(Person::getSalary));System.out.println("工资最高"+person.get().getSalary());}

执行结果:

****//计算Integer集合中大于6的元素的个数****
   @Testpublic void test7(){System.out.println("大于6的个数"+list.stream().filter(x -> x > 6).count());}

执行结果:

/*
*

映射

**可以将一个流的元素按照一定的映射规则映射到另一个流中
* 分为map和flatMap:
* map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素
* flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
* */****//英文字符串数组的元素全部改为大写。整数数组每个元素+3**
@Test
public void test8(){String[] strArr = {"asdaAda","dasadew","asdasder"};Arrays.stream(strArr).map(String::toUpperCase).forEach(System.out::println);List<Integer> integers = Arrays.asList(1,23,45,8,6,9);integers.stream().map(x->x+3).forEach(System.out::println);
}

执行结果:

//将员工的薪资全部增加1000。

   @Testpublic void test9(){//        System.out.println(personList.stream().map(person ->
//        {//            person.setSalary(person.getSalary() + 1000);
//            return person;
//        }).collect(Collectors.toList()));//不改变原来员工集合的方式List<Person> personList1 = personList.stream().map(person -> {Person person1 = new Person(person.getName(),0,0,null,null);person1.setSalary(person.getSalary()+1000);return person1;}).collect(Collectors.toList());System.out.println("一次改动前:"+personList.get(0).getName()+"-->"+personList.get(0).getSalary());System.out.println("一次改动后:"+personList1.get(0).getName()+"-->"+personList1.get(0).getSalary());System.out.println("一次改动前:"+personList.get(0));System.out.println("一次改动后:"+personList1.get(0));//改变原来集合的方式List<Person> personList2 = personList.stream().map(person ->{person.setSalary(person.getSalary() + 1000);return person;}).collect(Collectors.toList());System.out.println("二次改动前:"+personList.get(0).getName()+"-->"+personList.get(0).getSalary());System.out.println("二次改动后:"+personList2.get(0).getName()+"-->"+personList2.get(0).getSalary());System.out.println("二次改动前:"+personList.get(0));System.out.println("二次改动后:"+personList2.get(0));}

执行结果:

//将两个字符数组合并成一个新的字符数组

 @Testpublic void test10(){List<String> list = Arrays.asList("a,s,de,sd","4,56,8,k,gj");List<String> listNew = list.stream().flatMap(s->{//将每个元素转成成一个streamString[] split = s.split(",");Stream<String> s2 = Arrays.stream(split);return s2;}).collect(Collectors.toList());System.out.println("处理前的集合"+list);System.out.println("处理后的集合"+listNew);}

执行结果:

/*
*

归约(reduce)

* **归约,也称缩减,顾名思义,是把一个流缩减成一个值
* 能实现对集合求和、求乘积和求最值操作**
* */
 @Testpublic void test11(){//求和方式1:Optional<Integer> sum1 = list.stream().reduce((x1,x2)->x1+x2);//求和方式2Optional<Integer> sum2 = list.stream().reduce(Integer::sum);//求和方式3Integer sum3 = list.stream().reduce(0, Integer::sum);//求乘积Optional<Integer> product = list.stream().reduce((a,b)->a*b);//求最大值方式1:Optional<Integer> max1 = list.stream().reduce((x,y)->x>y?x:y);//求最大值方式2:Integer max2 = list.stream().reduce(0,Integer::max);//求最大值方式4 非规约Optional<Integer> max4= list.stream().max(Integer::compareTo);System.out.println("list求和:" + sum1.get() + "," + sum2.get() + "," + sum3);System.out.println("list求积:" + product.get());System.out.println("list求最大:" + max1.get() + "," + max2+ "," +  "," + max4);}

执行结果:

//求所有员工的工资之和和最高工资

 @Testpublic void test12(){//求工资之和方式1Optional<Integer> sumSalary = personList.stream().map(Person::getSalary).reduce(Integer::sum);//求工资之和方式2Integer sumSalary1 = personList.stream().reduce(0,(sum,p)->sum+=p.getSalary(),(sum1,sum2)->sum1+sum2);//求工资之和方式3Integer sumSalary2 = personList.stream().reduce(0,(sum,p)->sum+=p.getSalary(),Integer::sum);//求最高工资方式1Integer maxSalary1 = personList.stream().reduce(0,(max,p)-> max>p.getSalary() ? max:p.getSalary(),Integer::max);//求最高工资方式2Integer maxSalary2 = personList.stream().reduce(0,(max,p)->max>p.getSalary()? max:p.getSalary(),(max1,max2)->max1>max2?max1:max2);//求最高工资方式3Integer maxSalary3 = personList.stream().reduce(0,(max,p)-> max>p.getSalary() ? max:p.getSalary(),Integer::compareTo);System.out.println("工资之和:" + sumSalary.get() + "," + sumSalary2 + "," + sumSalary1);System.out.println("最高工资:" + maxSalary1 + "," + maxSalary2+","+maxSalary3);}

执行结果:

/

/收集(collect)

**/*
* collect 收集 可以说是内容最繁多、功能最丰富的部分了
* 从字面上去理解 就是把一个流收集起来
* 最终可以是收集成一个值也可以收集成一个新的集合
* collect主要依赖java.util.stream.Collectors类内置的静态方法
* */**/*

*归集(toList/toSet/toMap)

*
* **因为流不存储数据,那么在流中的数据完成处理后
* 需要将流中的数据重新归集到新的集合里
* toList、toSet和toMap比较常用
* 另外还有toCollection、toConcurrentMap等复杂一些的用法**
* */

测试用法

@Test
public void test13(){List<Integer> listNew = list.stream().filter(x->x%2==0).collect(Collectors.toList());Set<Integer> setNew = list.stream().filter(x->x%2!=0).collect(Collectors.toSet());Map<?,Person> map = personList.stream().filter(p->p.getSalary()<8000).collect(Collectors.toMap(Person::getName,p->p));System.out.println("toList:" + listNew);System.out.println("toSet:" + setNew);System.out.println("toMap:" + map);}

执行结果:

//统计员工人数、平均工资、工资总额、最高工资

@Test
public void test14(){//求总数Long count = personList.stream().collect(Collectors.counting());//求平均工资Double avg = personList.stream().collect(Collectors.averagingDouble(Person::getSalary));//求最高工资Optional<Integer> max = personList.stream().map(Person::getSalary).collect(Collectors.maxBy(Integer::max));//求工资之和Integer sum = personList.stream().collect(Collectors.summingInt(Person::getSalary));DoubleSummaryStatistics collect = personList.stream().collect(Collectors.summarizingDouble(Person::getSalary));System.out.println("员工总数:" + count);System.out.println("员工平均工资:" + avg);System.out.println("员工工资总和:" + sum);System.out.println("员工工资所有统计:" + collect);}

执行结果:

java jdk8 Stream流操作学习相关推荐

  1. JAVA的stream流操作详细解析

    java的stram流操作 为什么需要 Stream 流与集合的区别 对比:原始集合操作与Stream集合操作 (过滤/映射/扁平化/遍历/排序/去重/跳过/截断的应用) 流的组成 流操作的分类 流的 ...

  2. 吃透JAVA的Stream流操作,多年实践总结

    在JAVA中,涉及到对数组.Collection等集合类中的元素进行操作的时候,通常会通过循环的方式进行逐个处理,或者使用Stream的方式进行处理. 例如,现在有这么一个需求: 从给定句子中返回单词 ...

  3. 【小家java】Stream流操作的有状态 vs 无状态

    相关阅读 [小家java]java5新特性(简述十大新特性) 重要一跃 [小家java]java6新特性(简述十大新特性) 鸡肋升级 [小家java]java7新特性(简述八大新特性) 不温不火 [小 ...

  4. Java基础学习总结(132)——Java8 Stream流操作学习总结

    传统的数据处理都是用循环来解决,而不是像搜索数据库那样有具体的搜索语句,而Java8的Stream提供了很好的方案,往往一行就搞定了,而且Stream还可以链式操作,一行代码实现多个循环的功能,代码风 ...

  5. 【java基础】吐血总结Stream流操作

    文章目录 Stream流操作讲解 在这里插入图片描述 1 Stream概述 2 Stream与传统遍历对比 3 Stream的创建 4 Stream的使用 4.1 遍历/匹配(foreach.find ...

  6. Stream 流 【学习笔记】Java 基础

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 写这篇博客旨在制作笔记,方便个人在线阅览,巩固知识,无其他用途. 学习视频 [黑马 Java 基础教程] ...

  7. Java 8 - Stream流骚操作解读2_归约操作

    文章目录 Pre 什么是归约操作 元素求和 reduce reduce如何运行的 最大值和最小值 Pre Java 8 - Stream流骚操作解读见到过的终端操作都是返回一个 boolean ( a ...

  8. [Java基础]Stream流的收集操作

    代码如下: package CollectPack;import java.util.*; import java.util.stream.Collectors; import java.util.s ...

  9. Java 8 Stream中间操作(方法)示例

    Java 8 Streams中间操作的完整指南. 所有内置Stream API中间操作(方法)的列表以及示例. 1.概述 在本教程中,我们将学习什么是 Java 8 Stream 中的中间操作 . 所 ...

最新文章

  1. 【android】两个按钮的宽度各占屏幕的一半
  2. 一个html文档所需要的最基本的标记对是,川大《WEB技术》19秋在线作业1题目【标准答案】...
  3. 2017.4.6AM
  4. 【Linux】JDK+Eclipse 搭建C/C++开发环境
  5. 【Socket网络编程】1.bind()和 INADDR_ANY 解析
  6. 编译gcc4.4.6与ICE遇到的几个问题
  7. OpenCV图像翻转:flip()函数的使用
  8. 关于WebApi 跨域问题的解决的方式
  9. 调试生产服务器– Eclipse和JBoss展示
  10. Linux常用命令(知道啦就赶紧收藏吧)
  11. leetcode704. 二分查找
  12. c 调用matlab文件路径,C/C++下调用matlab函数操作说明
  13. Unity上的Oculus Quset2开发(2) —— 在VR里打棒球
  14. Linux入门之VIM快捷使用
  15. OSI七层参考模型、TCP/IP参考模型、数据封装与解封装、TCP三次握手四次挥手及面试题
  16. net use远程重启服务器
  17. 2021-06-07java继承
  18. Python__关于列表的引用 以append操作为例
  19. 安卓股票悬浮窗_股票悬浮窗的安卓应用
  20. Activity启动模式之singleTask属性taskAffinity浅谈

热门文章

  1. 学英语以及中文快速阅读的启迪,从“为什么全世界只有中日两个国家弹幕视频网站成为流行?”说开去
  2. python 按顺序读文件夹下面的文件
  3. Wifidog网关协议V1
  4. 用友mysql数据库安装_如何重新安装和恢复Mysql数据库
  5. redis失效策略和删除策略
  6. 命名管道(FIFO)
  7. 基于微信小程序的闲置物品捐赠及回收平台小程序-计算机毕业设计
  8. Hamsters Training(组合数学)
  9. kettle8在eclipse上运行(windows)
  10. android显示动画一直播放器,播放器适配经验总结——Android