package stream;

import model.Student;
import org.junit.jupiter.api.Test; import java.util.*;
import java.util.stream.Collectors; /**
* 使用Stram流操作集合信息
* @auther minghao
* @date 2019.02.11
*/
public class studyStream { /**
*
*/
@Test
public void test3() {
//1.创建实体类准备数据
List<Student> students = new ArrayList<Student>() {
{
add(new Student(20160001, "孔明", 20, 1, "土木工程", "武汉大学"));
add(new Student(20160002, "伯约", 21, 2, "信息安全", "武汉大学"));
add(new Student(20162001, "仲谋", 19, 3, "土木工程", "浙江大学"));
add(new Student(20162001, "仲谋", 25, 3, "土木工程", "浙江大学"));
add(new Student(20162001, "仲谋", 28, 3, "土木工程", "浙江大学"));
add(new Student(20160003, "玄德", 22, 3, "经济管理", "武汉大学"));
add(new Student(20160004, "云长", 21, 2, "信息安全", "武汉大学"));
add(new Student(20161001, "翼德", 21, 2, "机械与自动化", "华中科技大学"));
add(new Student(20161002, "元直", 23, 4, "土木工程", "华中科技大学"));
add(new Student(20161003, "奉孝", 23, 4, "计算机科学", "华中科技大学"));
add(new Student(20162001, "仲谋", 22, 3, "土木工程", "浙江大学"));
add(new Student(20162002, "鲁肃", 23, 4, "计算机科学", "浙江大学"));
add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大学"));
}
}; /**
* 方式一:前面例子中使用的方式
* 获取计算机科学专业学生的年龄总和
*/
int totalAge = students.stream().filter(student -> "计算机科学".equals(student.getMajor())).mapToInt(Student::getAge).sum(); /**
* 方式二:归约操作 reduce
* 获取计算机科学专业学生的年龄总和
*/
int totalAge2 = students.stream().filter(student -> "计算机科学".equals(student.getMajor()))
.mapToInt(Student::getAge).reduce(0,(a,b) -> a+b); /**
* 方式三:归约操作(进一步简化) reduce
* 获取计算机科学专业学生的年龄总和
*/
int reduceAges = students.stream().filter(student -> "计算机科学".equals(student.getMajor()))
.mapToInt(Student::getAge).reduce(0,Integer::sum);
/**
* 方式四:归约操作(进一步简化) reduce
* 采用无初始值的重载版本,需要注意返回Optional
* 获取计算机科学专业学生的年龄总和
*/
Optional optAges = students.stream().filter(student -> "计算机科学".equals(student.getMajor()))
.map(Student::getAge).reduce(Integer::sum); /**
* 求学生的总数
*/
long count = students.stream().collect(Collectors.counting());
//进一步简化
long count1 = students.stream().count(); /**
* 求年龄的最大值和最小值
*/ //求最大年龄
Optional<Student> collect = students.stream().collect(Collectors.maxBy((s1, s2) -> s1.getAge() - s2.getAge()));
//进一步简化 求最大年龄
Optional<Student> collect1 = students.stream().collect(Collectors.maxBy(Comparator.comparing(Student::getAge)));
//求最小年龄
Optional<Student> collect2 = students.stream().collect(Collectors.minBy(Comparator.comparing(Student::getAge))); /**
* 求年龄总和
*/
Integer sunAges = students.stream().collect(Collectors.summingInt(Student::getAge)); /**
* 求年龄的平均值
*/
Double avgAge = students.stream().collect(Collectors.averagingInt(Student::getAge)); /**
* 一次性得到元素(年龄)的个数、总和、均值、最大值、最小值
*/
IntSummaryStatistics collect3 = students.stream().collect(Collectors.summarizingInt(Student::getAge)); /**
* 字符串拼接,拼接所有对象的名字
*/
String join = students.stream().map(Student::getName).collect(Collectors.joining());
String join2 = students.stream().map(Student::getName).collect(Collectors.joining(",")); /**
* 按照学校进行分组(一级分组)
*/
Map<String, List<Student>> groupbySchool = students.stream().collect(Collectors.groupingBy(Student::getSchool)); /**
* 按照学校进行分组,再按照专业分组(多级分组)
*/
Map<String,Map<String,List<Student>>> groupbySchoolAndMajor = students.stream().collect(
Collectors.groupingBy(Student::getSchool, //一级分组
Collectors.groupingBy(Student::getMajor) //二级分组(二级套在一级里面)
)); /**
* 传递一个Collector.counting,用以统计每个组的个数:
* 统计根据学校分组,每组的数量
*/
Map<String, Long> counting = students.stream().collect(Collectors.groupingBy(Student::getSchool, Collectors.counting())); /**
* 使用分区Collectors.partitioningBy()
* 将学生分为武大学生和非武大学生
*/
Map<Boolean, List<Student>> isWhuSchool = students.stream().collect(Collectors.partitioningBy(student -> "武汉大学".equals(student.getSchool()))); System.out.println();
} /**
*
*/
@Test
public void test2(){
//1.创建实体类准备数据
List<Student> students = new ArrayList<Student>() {
{
add(new Student(20160001, "孔明", 20, 1, "土木工程", "武汉大学"));
add(new Student(20160002, "伯约", 21, 2, "信息安全", "武汉大学"));
add(new Student(20162001, "仲谋", 19, 3, "土木工程", "浙江大学"));
add(new Student(20162001, "仲谋", 25, 3, "土木工程", "浙江大学"));
add(new Student(20162001, "仲谋", 28, 3, "土木工程", "浙江大学"));
add(new Student(20160003, "玄德", 22, 3, "经济管理", "武汉大学"));
add(new Student(20160004, "云长", 21, 2, "信息安全", "武汉大学"));
add(new Student(20161001, "翼德", 21, 2, "机械与自动化", "华中科技大学"));
add(new Student(20161002, "元直", 23, 4, "土木工程", "华中科技大学"));
add(new Student(20161003, "奉孝", 23, 4, "计算机科学", "华中科技大学"));
add(new Student(20162001, "仲谋", 22, 3, "土木工程", "浙江大学"));
add(new Student(20162002, "鲁肃", 23, 4, "计算机科学", "浙江大学"));
add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大学"));
}
}; /**
* 2.使用stream流的filter过滤,通过lambda表达式从集合students中筛选出所有武汉大学的学生
*
* stream():将students集合转为stream流
* filter(): 中间操作 使用lambda表达式进行判断,返回boolean类型
* collect(): 终端操作
* Conllect.toList(): 将结果封装成为一个list集合
*/ List<Student> whustudents = students.stream().filter(student -> "武汉大学".equals(student.getSchool())).collect(Collectors.toList()); /**
* 3.使用stream流的filter + limit,通过lambda表达式从集合students中获取2个专业为土木工程专业的学生
*
* stream():将students集合转为stream流
* filter(): 中间操作 使用lambda表达式进行判断,返回boolean类型
* limit():限制返回的数量
* collect(): 终端操作
* Conllect.toList(): 将结果封装成为一个list集合
*
*/
List<Student> limitStudents = students.stream().filter(a -> "土木工程".equals(a.getMajor())).limit(2).collect(Collectors.toList()); /**
* 4.使用stream流的filter + limit + sorted,
* 通过lambda表达式从集合students中获取2个专业为土木工程专业的学生,
* 并按年龄从小到大排序,筛选出年龄最小的两个学生
*
* stream():将students集合转为stream流
* filter(): 中间操作 使用lambda表达式进行判断,返回boolean类型
* limit():限制返回的数量
* sorted():对两个值进行排序
* collect(): 终端操作
* Conllect.toList(): 将结果封装成为一个list集合
*
*/
List<Student> sortedStudents = students.stream().filter(student -> "土木工程".equals(student.getMajor()))
.sorted((s1,s2) -> s1.getAge() - s2.getAge()).limit(2).collect(Collectors.toList()); /**
* 5.使用stream流 filter + skip 找出排序在2之后的土木工程专业的学生
*
* stream():将students集合转为stream流
* filter(): 中间操作 使用lambda表达式进行判断,返回boolean类型
* skip():对筛选出来的结果,排除前面N个数量
* collect(): 终端操作
* Conllect.toList(): 将结果封装成为一个list集合
*/
List<Student> skipStudents = students.stream().filter(student -> "土木工程".equals(student.getMajor()))
.skip(2).collect(Collectors.toList()); /**
* 1.使用stream流 filter + map 通过map将学生实体映射成为学生姓名字符串
* 获取专业为计算机科学的所有学生姓名
*
* stream():将students集合转为stream流
* filter(): 中间操作 使用lambda表达式进行判断,返回boolean类型
* .map(Student :: getName):获取当前实体类的姓名,返回给list集合
* collect(): 终端操作
* Conllect.toList(): 将结果封装成为一个list集合
*/
List<String> names = students.stream().filter(student -> "计算机科学".equals(student.getMajor()))
.map(Student :: getName).collect(Collectors.toList()); /**
* 2.使用stream流 filter + map 通过map将学生实体映射成为学生年龄
* 获取专业为计算机科学的所有学生年龄
*
* stream():将students集合转为stream流
* filter(): 中间操作 使用lambda表达式进行判断,返回boolean类型
* .map(Student :: getAge):获取当前实体类的年龄,返回给list集合
* collect(): 终端操作
* Conllect.toList(): 将结果封装成为一个list集合
*/
List<Integer> ages = students.stream().filter(student -> "计算机科学".equals(student.getMajor()))
.map(Student :: getAge).collect(Collectors.toList()); /**
* 3.使用stream流 filter + maptoInt 通过map将学生实体映射成为学生年龄 的总和
* 获取专业为计算机科学的所有学生年龄 的总和(年龄相加)
*
* stream():将students集合转为stream流
* filter(): 中间操作 使用lambda表达式进行判断,返回boolean类型
* .map(Student :: getAge):获取当前实体类的年龄,返回给list集合
* sum(): 返回年龄的总和(年龄相加)
*/
int agesSum = students.stream().filter(student -> "计算机科学".equals(student.getMajor()))
.mapToInt(Student :: getAge).sum(); String[] strs = {"java8", "is", "easy", "to", "use"};
/**
* 将数组strs 中的每个元素使用split 拆分成为数组
* 返回list<String[]>的集合数组
* 注:distinct只有对于一个包含多个字符的流进行操作才能达到我们的目的
* 因此,下面两行代码效果一致
*/
List<String[]> distinctStrs = Arrays.stream(strs).map(str -> str.split("")).distinct().collect(Collectors.toList());
List<String[]> Strs = Arrays.stream(strs).map(str -> str.split("")).collect(Collectors.toList()); /**
* 将数组strs 中的每个元素使用split 拆分成为数组
* flatMap():将数组的多个元素转换成为一个元素进行输出
*
* flatMap与map的区别在于 flatMap是将一个流中的每个值都转成一个个流,然后再将这些流扁平化成为一个流 。
*/
List<String> flatMapStrs = Arrays.stream(strs).map(str -> str.split("")) //得到List<String[]>
.flatMap(Arrays::stream).collect(Collectors.toList()); //将List<String[]> 转化为List<String> String a = flatMapStrs.toString(); /**
* allMatch():判断当前集合中所有人的年龄是否大于等于18岁
* true 全部大于/等于
* false 相反
*/
boolean isAdult = students.stream().allMatch(student -> student.getAge() >= 18); /**
* anyMatch():判断当前集合中是否存在个别人的年龄是否大于等于18岁
* true 一个或多个存在
* false 一个也不存在
*/
boolean hasWhu = students.stream().anyMatch(student -> student.getAge() >= 18); /**
* noneMatch():判断当前集合是否不存在filter指定的元素
* true 不存在
* false 存在
*/
boolean noneCs = students.stream().noneMatch(student -> "计算机科学".equals(student.getMajor())); /**
* findFirst():返回返回满足条件的第一个元素
*/
Optional<Student> optstu = students.stream().filter(student -> "土木工程".equals(student.getMajor())).findFirst(); /**
* findAny():返回返回满足条件的任意一个元素
*/
Optional<Student> anyoptstu = students.stream().filter(student -> "土木工程".equals(student.getMajor())).findAny(); System.out.println(); } /**
* 初步使用stream流完集合遍历
*/
@Test
public void test(){
//1.准备数据
List<Integer> nums = new ArrayList<>();
for (int i = 1; i <= 20;i++){
nums.add(i);
}
for (int i = 10; i <= 20;i++){
nums.add(i);
} //2.使用foreach筛选偶数
List<Integer> evens = new ArrayList<>();
for (Integer num: nums) {
if (num % 2 == 0)
evens.add(num);
} /**
* 3.1:使用stream流完成筛选偶数 返回list集合 filter() +collect()
*
* 一个流的处理分为三部分:转换成流 ——> 中间操作(自定义) ——> 终端操作
* 例如:
* stream():将集合转换成流
* filter():指定我们自定义的筛选处理/自定义其他处理
* collect():对结果进行封装处理
* Collectors.toList():指定其筛选流结果,封装成一个List集合进行返回
*/
List<Integer> StreamEvens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList());
System.out.println(); /**
* 3.2:使用stream流完成筛选偶数,并去掉重复 返回list集合 filter() + distinct() + collect()
*
* stream():将集合转换成流
* filter():指定我们自定义的筛选处理/自定义其他处理
* collect():对结果进行封装处理
* distinct():去掉重复
* Collectors.toList():指定其筛选流结果,封装成一个List集合进行返回
*/
List<Integer> distinctEvens = nums.stream().filter(num -> num % 2 == 0).distinct().collect(Collectors.toList());      
    /**
    * 使用stream流+foreach遍历输出 集合中的所有数据
    */
    nums.stream().forEach(num -> System.out.println(num));
        System.out.println();

    }

}

Java 1.8 Stream 用例测试的更多相关文章

  1. Java 银联支付官网demo测试及项目整合代码

    注:原文来源与 < Java 银联支付官网demo测试及项目整合代码  > 银联支付(网关支付B2C) 一.测试官网demo a)下载官网开发包,导入eclipse等待修改(下载的开发包没 ...

  2. Kafka在Linux上安装部署及样例测试

    Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了普通消息系统的功能,但具有自己独特的设计.这个独特的设计是什么样的呢 介绍 Kafka是一个分布式的.可分区的.可复制的消息系统.它提供了 ...

  3. java中的Stream流

    java中的Stream流 说到Stream便容易想到I/O Stream,而实际上,谁规定"流"就一定是"IO流"呢?在Java 8中,得益于Lambda所带 ...

  4. 详解Java 8中Stream类型的“懒”加载

    在进入正题之前,我们需要先引入Java 8中Stream类型的两个很重要的操作: 中间和终结操作(Intermediate and Terminal Operation) Stream类型有两种类型的 ...

  5. PMD(Put Me Down)用例测试

    PMD(Put Me Down)--用例测试 一.测试工作安排 6个成员随机分配一个模块进行测试,测试完成后将最后的结果汇总到测试用例文档中. 二.测试工具的选择与运用 测试工具选择:这次还没用工具, ...

  6. java新手笔记12 单例

    1.单例 package com.yfs.javase; public class Singleton { //private static final Singleton single = new ...

  7. java.io.IOException: Stream closed

    今天在做SSH项目的时候,出现了这个错误.百思不得其解,网上的答案都不能解决我的问题-.. 后来,一气之下就重新写,写了之后发现在JSP遍历集合的时候出错了. <s:iterator value ...

  8. Java基础(十一) Stream I/O and Files

    Java基础(十一) Stream I/O and Files 1. 流的概念 程序的主要任务是操纵数据.在Java中,把一组有序的数据序列称为流. 依据操作的方向,能够把流分为输入流和输出流两种.程 ...

  9. java.io.IOException: Stream closed解决办法

    1.出现这个bug的大体逻辑代码如下: private static void findMovieId() throws Exception { File resultFile = new File( ...

随机推荐

  1. mongodb什么时候使用

    转自:https://blog.csdn.net/justlpf/article/details/80392944 简介 MongoDB[1] 是一个基于分布式文件存储的数据库.由C 语言编写.旨在为 ...

  2. 如何将Map键值的下划线转为驼峰

    本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:如何将Map键值的下划线转为驼峰: 例,将HashMap实例extMap键值下划线转为驼峰: 代码: HashMap<String ...

  3. spring boot项目搭建中遇到的问题

    自己动手搭建一下spring boot的项目,中途遇到了几个问题,在这里记录一下! 一.关于数据库中的表设计的问题 1.设计表的时候一定要添加的两个字段created updated 创建时间与更新时 ...

  4. Pickle(1)

    1,pickle用于字符显示与存储之间的转换 2,要注意几个点 (1) 使用dump和load: (2) 版本号的要求: 3,官方文档的两个例子 4,pickle之后,数据是什么样的呢? https: ...

  5. Ionic 包名修改 步骤

    1.config.xml => <widget id=...... 2.plugin 中 android.json 里面package 3.platforms\android 里面 and ...

  6. python 3.6 关于python的介绍

    python的官方网站 https://www.python.org/ python 3.6 的官方网站的下载地址 https://www.python.org/downloads/release/p ...

  7. 关于CSS3 animation 属性在ie edge浏览器中不能工作

    我想要给div边框加一个闪烁,所以我将css中设置如下 给想要闪烁的div加上blink类  这样在firefox,chrome下是正常显示的,但是在ie下box-shadow属性不能被正常的展现 后 ...

  8. vue 编写插件

    1.    将插件逻辑封装成一个对象  最后在install编写业务代码暴露给Vue对象 好处: 可以添加任意参数在这个对象上 方便将install函数封装的更加精简 可拓展性也比较高 2.  将所有 ...

  9. 《DSP using MATLAB》Problem 7.33

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  10. input光标错位

    文档结构 <div class="noteWrap"> <input type="text" placeholder="写留言&qu ...