package com.fan.yygh.hosp;import org.junit.jupiter.api.Test;import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;public class StreamTest {@Test //流的创建public void test01(){//1.通过集合Collections集合提供的stream()或者parallelStream()ArrayList<Integer> list = new ArrayList<Integer>( Arrays.asList(1, 2, 3, 4));Stream<Integer> stream1 = list.stream();//Stream<Integer> parallelStream = list.parallelStream();//2.数组获取流的方式,通过Arrays中的静态方法stream()获取数组流int[] arr = new int[]{1,2,3,4};IntStream stream2 = Arrays.stream(arr);stream2.filter((x) -> x>2).forEach(System.out::println);//3.通过Stream类中的静态方法of()来获取流Stream<String> stream3 = Stream.of("a", "b", "c");Stream.of(6,7,8).forEach(System.out::println);stream3.forEach(System.out::println);//4.由函数生成流---创建无限流:Stream.iterate和Stream.generate:// 4.1,iterate:从0开始,一直在原来数的基础上增加2来生产一个流/*static <T> Stream<T> iterate​(T seed, UnaryOperator一元运算<T> f)static <T> Stream<T> iterate​(T seed, Predicate<? super T> hasNext,UnaryOperator<T> next)*/Stream.iterate(0,(x)->x+2).limit(3).forEach(System.out::println);//4.2,static <T> Stream<T> generate​(Supplier<? extends T> s)// generate​该方法主要用于生成一个无限连续的无序流,// 流中的元素由用户定义的supplier函数生成Stream.generate( ()-> Math.random() ) //generate的参数是Supplier供给型接口.limit(5) //获取前5个元素,用于限制无限流的长度为5,如果没有limit则是一个死循环输出.forEach(System.out::println); //遍历输出}//中间操作filter@Testpublic void test02(){//筛选(filterArrayList<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3, 4));list.stream().filter( x -> x >2 ) //过滤条件,当流中数据大于2的时候放入新流中.forEach(System.out::println); //遍历输出//案例二:List<Person> personList = new ArrayList<Person>();personList.add(new Person("Tom", 8900, 23, "male", "New York"));personList.add(new Person("Jack", 7000, 25, "male", "Washington"));personList.add(new Person("Lily", 7800, 21, "female", "Washington"));personList.add(new Person("Anni", 8200, 24, "female", "New York"));personList.add(new Person("Owen", 9500, 25, "male", "New York"));personList.add(new Person("Alisa", 7900, 26, "female", "New York"));List<String> listName = personList.stream().filter((x) -> x.getSalary() > 8000) //条件过滤工资.map(Person::getName) //提取工资大于8000的人的名字.collect(Collectors.toList());//转成listSystem.out.println(listName);}//中间操作map@Testpublic void test03(){//map的案例一ArrayList<Student> list = new ArrayList<>(Arrays.asList(new Student("张三",12,"man"),new Student("李四",32,"man"),new Student("王五",22,"woman"),new Student("赵六",45,"woman")));list.stream()//.map( Student::getName) //这里使用引用.map( (stu)->stu.getName() ).forEach(System.out::println);//案例2:List<String> list1 = Arrays.asList("a", "b", "c");list1.stream().map((str)-> {return str.toUpperCase();} ).forEach(System.out::println);//案例一:英文字符串数组的元素全部改为大写。整数数组每个元素+3。System.out.println("案例一:英文字符串数组的元" +"素全部改为大写。整数数组每个元素+3。");String[] arr = new String[] {"abcd", "bcdd", "defde", "fTr" };Arrays.stream(arr).map( (s)->s.toUpperCase()/*映射规则*/).forEach(System.out::println);int[] intArr = new int[]{1,2,3,4};Arrays.stream(intArr).map((x) -> x+3).forEach(System.out::println);//案例三List<Person> personList = new ArrayList<Person>();personList.add(new Person("Tom", 8900, 23, "male", "New York"));personList.add(new Person("Jack", 7000, 25, "male", "Washington"));personList.add(new Person("Lily", 7800, 21, "female", "Washington"));personList.add(new Person("Anni", 8200, 24, "female", "New York"));personList.add(new Person("Owen", 9500, 25, "male", "New York"));personList.add(new Person("Alisa", 7900, 26, "female", "New York"));// 不改变原来员工集合的方式List<Person> listNew = personList.stream().map((person) -> {Person p = new Person(person.getName(), 0, 0, null, null);p.setSalary(person.getSalary() + 1000);//设置新工资return p; //返回新person}).collect(Collectors.toList());//转成集合listSystem.out.println("一次改动前:" + personList);System.out.println("一次改动后:" + listNew);// 改变原来员工集合的方式List<Person> list2 = personList.stream().map((person) -> {person.setSalary(person.getSalary() + 1000);return person;}).collect(Collectors.toList());System.out.println(list2);/*========end==========*/}@Testpublic void test04(){//自然排序:流中元素需实现Comparable接口List<String> stringList = Arrays.asList("ccc", "aaa", "bbb", "ddd");stringList.stream().sorted().forEach(System.out::println);//输出: aaa,bbb,ccc,ddd//定制排序List<Person> personList = new ArrayList<Person>();personList.add(new Person("Tom", 8900, 23, "male", "New York"));personList.add(new Person("Jack", 7000, 25, "male", "Washington"));personList.add(new Person("Lily", 7800, 21, "female", "Washington"));personList.add(new Person("Anni", 8200, 24, "female", "New York"));personList.add(new Person("Owen", 9500, 25, "male", "New York"));personList.add(new Person("Alisa", 7900, 26, "female", "New York"));personList.stream().sorted( (e1,e2)->{//自己实现比较规则if( e1.getSalary() == e2.getSalary()){//如果工资相等return e1.getAge()-e2.getAge();//则按照年龄排序}else{//如果工资不相等,按照工资排序return -(e1.getSalary()-e2.getSalary() );}}).forEach(System.out::println);}@Testpublic void test05(){String[] arr1 = { "a", "b", "c", "d","c" };String[] arr2 = { "d", "e", "f", "g" };//1.合并连接:Stream.concat(stream1,stream2)System.out.println("合并:");Stream<String> stream1 = Stream.of(arr1);Stream<String> stream2 = Stream.of(arr2);Stream.concat(stream1,stream2).forEach(System.out::print); //abcddefg//2 .去重,去除重复元素System.out.println("\n去重:");Arrays.stream(arr1).distinct().forEach(System.out::print);// 3.limit:限制从流中获得前n个数据System.out.println();Stream.iterate(0,x->x+2).limit(5) //获取前5个数据.forEach(System.out::println);// 4.skip:跳过前n个数据Stream.generate(Math::random).limit(10)//获取前10个数.skip(5) //并跳过前5个数.forEach(System.out::println);}@Test //终止操作public void test06(){//1.遍历foreachList<Integer> list = Arrays.asList(7, 6, 9, 3, 8);list.stream().forEach(System.out::println); //遍历输出//2.匹配(find/match)//findFirst:  匹配第一个Optional<Integer> first = list.stream().findFirst(); //不能再使用其他终止操作forEachSystem.out.println("匹配第一个:"+first.get());//findAny:匹配任意(适用于并行流)Optional<Integer> any = list.parallelStream().findAny();System.out.println("找到任意一个:"+any.get());//match案例3个://allMatch:检查是否匹配所有元素boolean b1 = list.stream().allMatch(x -> x > 2);System.out.println("检查是否所有元素大于2:"+b1);//anyMatch:检查是否至少匹配一个元素boolean b2 = list.stream().anyMatch(x -> x > 2);System.out.println("检查是否至少有一个元素大于2:"+b2);//noneMatch:检查是否没有 匹配所有元素boolean b3 = list.stream().noneMatch(x -> x > 2);System.out.println("检查是否没有 大于2的元素:"+b3);}@Testpublic void reducetest(){List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);// 求和方式1Optional<Integer> reduce = list.stream().reduce((x, y) -> x + y);System.out.println("求和方式1:"+reduce.get());// 求和方式2Optional<Integer> reduce1 = list.stream().reduce(Integer::sum);//调用包装类Integer的静态方法sum()System.out.println("求和方式2,Integer的静态方法sum:"+reduce1.get());// 求和方式3Integer reduce2 = list.stream().reduce(0, Integer::sum);//参数一是用来保存归并参数的初始值,参数二是计算方法System.out.println("求和方式3:"+reduce2);// 求乘积Optional<Integer> reduce3 =list.stream().reduce((a, b) -> a * b);//参数是2个// 求最大值方式1Optional<Integer> reduce4 =list.stream().reduce((x, y) -> x > y ? x : y);// 求最大值写法2Optional<Integer> reduce5 = list.stream().reduce(Integer::max);Optional<Integer> reduce6 = list.stream().reduce(Integer::min);System.out.println("最大值:"+reduce5.get());System.out.println("最小值:"+reduce6.get());//求所有员工的工资之和和最高工资。List<Person> personList = new ArrayList<Person>();personList.add(new Person("Tom", 8900, 23, "male", "New York"));personList.add(new Person("Jack", 7000, 25, "male", "Washington"));personList.add(new Person("Lily", 7800, 21, "female", "Washington"));personList.add(new Person("Anni", 8200, 24, "female", "New York"));personList.add(new Person("Owen", 9500, 25, "male", "New York"));personList.add(new Person("Alisa", 7900, 26, "female", "New York"));// 求工资之和方式1:Optional<Integer> reduce7 = personList.stream().map(Person::getSalary) //映射出所有的工资.reduce(Integer::sum);System.out.println("求工资之和方式1:"+reduce7.get());// 求工资之和方式2:Integer sumSalary2 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(),(sum1, sum2) -> sum1 + sum2);// 求工资之和方式3:Integer sumSalary3 = personList.stream().reduce(0, (sum, p) -> sum += p.getSalary(),Integer::sum);// 求最高工资方式3:推荐Integer maxSalary3 = personList.stream().map(Person::getSalary).reduce(Integer::max).get();// 求最高工资方式1:Integer maxSalary = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(),Integer::max);// 求最高工资方式2:Integer maxSalary2 = personList.stream().reduce(0, (max, p) -> max > p.getSalary() ? max : p.getSalary(),(max1, max2) -> max1 > max2 ? max1 : max2);}@Testpublic void testjuhe(){List<String> list =Arrays.asList("adnm", "admmt", "pot", "xbangd", "weoujgsd");Optional<String> max = list.stream().max(Comparator.comparing(String::length));System.out.println(max.get());//案例三:获取员工薪资最高的人。List<Person> personList = new ArrayList<Person>();personList.add(new Person("Tom", 8900, 23, "male", "New York"));personList.add(new Person("Jack", 7000, 25, "male", "Washington"));personList.add(new Person("Lily", 7800, 21, "female", "Washington"));personList.add(new Person("Anni", 8200, 24, "female", "New York"));personList.add(new Person("Owen", 9500, 25, "male", "New York"));personList.add(new Person("Alisa", 7900, 26, "female", "New York"));Optional<Person> max1 = personList.stream().max(Comparator.comparingInt(Person::getSalary));System.out.println("最大工资的人:"+max1.get());}
}

java8的stream流的使用相关推荐

  1. Java8中Stream流对集合操作

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

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

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

  3. Java8的 Stream 流的各种用法

    Java8 的 Stream 流的各种用法 什么是Stream 1. Stream可以由数组或集合创建,对流的操作分为两种 2. Stream的特性 3. Stream可以通过集合数组创建 4. st ...

  4. Java8特性 stream流常用方法

    Java8特性 stream流常用方法 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方 ...

  5. java8中stream流解决两个list合并问题

    当我们遇到需要将两个list合并成一个list实体的时候,可以使用java8的stream流来解决,以下是我的一个小demo,可供大家参考学习. public ResultDto listBalanc ...

  6. Java8 的 Stream 流式操作之王者归来

    相对于Java8之前的Java的相关操作简直是天差地别,Java8 的流式操作的出现,也很大程度上改变了开发者对于Java的繁琐的操作的印象,从此,Java也走向了函数式编程的道路! 1 流的创建 1 ...

  7. java8使用stream流将list转map

    stream将list转化为map 在Stream流中将List转换为Map,是使用Collectors.toMap方法来进行转换. 1.key和value都是对象中的某个属性值. Map<St ...

  8. java8的stream流操作的数据结构

    在java8的流操作中分为终止符和非终止符. 非终止符不会触发数据的处理. 每次通过stream()方法新建立一个流的时候都会创建一个Head类.这个类是ReferencePipeline的一个内部类 ...

  9. java8的stream流编程的sorted排序方法

    list.stream().filter(categoryEntity -> categoryEntity.getParentCid()==0).map((menu)->{menu.set ...

最新文章

  1. Maximum Subsequence Value CodeForces - 1365E(规律+暴力)
  2. 都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...
  3. 信息学奥赛一本通 1136:密码翻译 | OpenJudge NOI 1.7 09
  4. 从苹果换回安卓没几天就熬不住了?怀念iPhone这七点
  5. 办暂住证,郁闷,极度不爽.
  6. 手把手教你使用Admob广告中介
  7. 【WordPress】视频有声音无图像
  8. 移动端屏幕适配和css美化浏览器自带的滚动条
  9. tarjan算法讲解。
  10. 【JavaWeb】之MVC三层架构
  11. G1 垃圾收集器详解
  12. Flutter最新开源框架,工作感悟
  13. ES索引恢复流程解析
  14. hevc中随机访问时非IRAP图像存在三种限制
  15. 手把手教你 VMware安装Kali Linux(超详细)
  16. 2022年山东省中职组“网络安全”赛项比赛任务书-1
  17. POJ 1737 Connected Graph(组合)
  18. grafana 实现自定义主题 Boom Theme
  19. [附源码]java毕业设计网上购物商城系统
  20. php漏洞可以过去root,phpdisk 漏洞发布 phpdisk header bypass getShell exp解析

热门文章

  1. 桌面接龙游戏 -_-
  2. el-table入门学习
  3. asciidoc_使用AsciiDoc编写文档
  4. MYSQL第十四次作业---电子商城数据库搭建
  5. Vmware安装就出现感叹号怎么解决
  6. 【RFID】OctaneSDKJava Eclipse报错Error occurred during initialization of boot layer
  7. 论文常用图表四:Bland-Altman图【MedCalc】
  8. 实现pandas导入excel时保留公式的文本内容
  9. vue里面调后台接口后用a标签单个下载和批量下载
  10. JAVA WEB 中间件为SERVLET(六)