java8的stream流的使用
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流的使用相关推荐
- Java8中Stream流对集合操作
java8中Stream流引入函数式编程思想,主要配合各种接口.lambda表达式.方法引用等方式,为集合的遍历.过滤.映射等提供非常"优雅"的操作方式. Student.java ...
- Java8种Stream流相关操作——集合的筛选、归约、分组、聚合
过滤.筛选 filter skip /*** 过滤 筛选*/@Testpublic void test2(){List<String> list = Arrays.asList(&qu ...
- Java8的 Stream 流的各种用法
Java8 的 Stream 流的各种用法 什么是Stream 1. Stream可以由数组或集合创建,对流的操作分为两种 2. Stream的特性 3. Stream可以通过集合数组创建 4. st ...
- Java8特性 stream流常用方法
Java8特性 stream流常用方法 Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据. Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方 ...
- java8中stream流解决两个list合并问题
当我们遇到需要将两个list合并成一个list实体的时候,可以使用java8的stream流来解决,以下是我的一个小demo,可供大家参考学习. public ResultDto listBalanc ...
- Java8 的 Stream 流式操作之王者归来
相对于Java8之前的Java的相关操作简直是天差地别,Java8 的流式操作的出现,也很大程度上改变了开发者对于Java的繁琐的操作的印象,从此,Java也走向了函数式编程的道路! 1 流的创建 1 ...
- java8使用stream流将list转map
stream将list转化为map 在Stream流中将List转换为Map,是使用Collectors.toMap方法来进行转换. 1.key和value都是对象中的某个属性值. Map<St ...
- java8的stream流操作的数据结构
在java8的流操作中分为终止符和非终止符. 非终止符不会触发数据的处理. 每次通过stream()方法新建立一个流的时候都会创建一个Head类.这个类是ReferencePipeline的一个内部类 ...
- java8的stream流编程的sorted排序方法
list.stream().filter(categoryEntity -> categoryEntity.getParentCid()==0).map((menu)->{menu.set ...
最新文章
- Maximum Subsequence Value CodeForces - 1365E(规律+暴力)
- 都 2021 年了,竟然有人搞大数据时忽略 JSON 而去研究用 C# 把 XML 转换为 XML 的技术...
- 信息学奥赛一本通 1136:密码翻译 | OpenJudge NOI 1.7 09
- 从苹果换回安卓没几天就熬不住了?怀念iPhone这七点
- 办暂住证,郁闷,极度不爽.
- 手把手教你使用Admob广告中介
- 【WordPress】视频有声音无图像
- 移动端屏幕适配和css美化浏览器自带的滚动条
- tarjan算法讲解。
- 【JavaWeb】之MVC三层架构
- G1 垃圾收集器详解
- Flutter最新开源框架,工作感悟
- ES索引恢复流程解析
- hevc中随机访问时非IRAP图像存在三种限制
- 手把手教你 VMware安装Kali Linux(超详细)
- 2022年山东省中职组“网络安全”赛项比赛任务书-1
- POJ 1737 Connected Graph(组合)
- grafana 实现自定义主题 Boom Theme
- [附源码]java毕业设计网上购物商城系统
- php漏洞可以过去root,phpdisk 漏洞发布 phpdisk header bypass getShell exp解析
热门文章
- 桌面接龙游戏 -_-
- el-table入门学习
- asciidoc_使用AsciiDoc编写文档
- MYSQL第十四次作业---电子商城数据库搭建
- Vmware安装就出现感叹号怎么解决
- 【RFID】OctaneSDKJava Eclipse报错Error occurred during initialization of boot layer
- 论文常用图表四:Bland-Altman图【MedCalc】
- 实现pandas导入excel时保留公式的文本内容
- vue里面调后台接口后用a标签单个下载和批量下载
- JAVA WEB 中间件为SERVLET(六)