Java8流式编程GroupBy和求最值示例
流的创建(演示常用的)
数组创建
Arrays.stream
Arrays的静态方法stream() 可以获取数组流
String[] arr = { "a", "b", "c", "d", "e", "f", "g" };
Stream stream = Stream.of(arr);
Stream stream1 = Arrays.stream(arr);
集合创建
Collection接口提供了两个默认方法创建流:stream()、parallelStream()
Listlist = new ArrayList (); list.add("a"); list.add("b"); list.add("c"); Stream stream = list.stream();
值创建
Stream.of
使用静态方法 Stream.of(), 通过显示值创建一个流。它可以接收任意数量的参数。
Streamstream = Stream.of(1, 2, 3, 4, 5, 6);
函数创建
Stream.iterate
Stream.generate
使用静态方法 Stream.iterate() 和 Stream.generate()创建无限流。
Streamstream = Stream.generate(Math::random).limit(5); Stream stream1 = Stream.iterate(0, i -> i + 1).limit(5);
注意:使用无限流一定要配合limit截断,不然会无限制创建下去。
GroupBy和求最值示例
实体类:
package com.demo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import lombok.ToString; /** lombok的使用需要的依赖:*/ @Data @AllArgsConstructor @NoArgsConstructor @ToString public class Student { private long id; private String name; private int age; private int grade; private String major; private String school; } org.projectlombok lombok 1.18.16
示例代码:
package com.demo; import java.math.BigDecimal; import java.util.*; import java.util.stream.Collectors; public class FileTest { public static void main(String[] args) { /*------------------复杂对象演示------------------------*/ Liststudents = new ArrayList () { { add(new Student(20160001, "孔明", 20, 1, "土木工程", "武汉大学")); add(new Student(20160003, "玄德", 22, 3, "经济管理", "武汉大学")); add(new Student(20161001, "翼德", 21, 2, "机械与自动化", "华中科技大学")); add(new Student(20161003, "奉孝", 23, 4, "计算机科学", "华中科技大学")); add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大学")); } }; // group by 统计用法示例 Map group2 = students.stream().collect( Collectors.groupingBy( Student::getSchool, Collectors.counting() ) ); //输出:{南京大学=1, 武汉大学=2, 华中科技大学=2} System.out.println(group2); TreeMap > collect = students.stream().collect( Collectors.groupingBy( Student::getSchool, TreeMap::new, Collectors.mapping(Student::getName, Collectors.toSet()) ) ); //输出:{华中科技大学=[翼德, 奉孝], 南京大学=[丁奉], 武汉大学=[孔明, 玄德]} System.out.println(collect); Map > collect3 = students.stream().collect( Collectors.groupingBy( Student::getSchool ) ); /* 输出:{ 南京大学=[Student(id=20163001, name=丁奉, age=24, grade=5, major=土木工程, school=南京大学)], 武汉大学=[ Student(id=20160001, name=孔明, age=20, grade=1, major=土木工程, school=武汉大学), Student(id=20160003, name=玄德, age=22, grade=3, major=经济管理, school=武汉大学) ], 华中科技大学=[ Student(id=20161001, name=翼德, age=21, grade=2, major=机械与自动化, school=华中科技大学), Student(id=20161003, name=奉孝, age=23, grade=4, major=计算机科学, school=华中科技大学) ] } * */ System.out.println(collect3); // 求最大 最小值 Student studentMax = students.stream().max((s1, s2) -> s1.getAge() - s2.getAge()).get(); Student studentMin = students.stream().min((s1, s2) -> s1.getAge() - s2.getAge()).get(); // 输出:Student(id=20163001, name=丁奉, age=24, grade=5, major=土木工程, school=南京大学) System.out.println(studentMax); // 输出:Student(id=20160001, name=孔明, age=20, grade=1, major=土木工程, school=武汉大学) System.out.println(studentMin); /*------------------基础数据类型演示------------------------*/ List list = new ArrayList () { { add(20); add(18); add(18); add(17); } }; Map collect1 = list.stream().collect( Collectors.groupingBy( (integer) -> integer, Collectors.counting() ) ); // 输出:{17=1, 18=2, 20=1} System.out.println(collect1); TreeMap > collect2 = list.stream().collect( Collectors.groupingBy( Integer::intValue, TreeMap::new, Collectors.mapping((integer) -> integer, Collectors.toList()) ) ); // 输出:{17=[17], 18=[18, 18], 20=[20]} System.out.println(collect2); Integer max = list.stream().max(Integer::compareTo).get(); Integer min = list.stream().min(Integer::compareTo).get(); System.out.println(max);// 输出:20 System.out.println(min);// 输出:17 /*------------------map集合演示------------------------*/ List