Java统计创建实例_Java8Stream:2万字20个实例,玩转集合
的筛选、归约、分组。。。
点波关注不迷路,⼀键三连好运连连!
先贴上⼏个案例,⽔平⾼超的同学可以挑战⼀下:
从员⼯集合中筛选出salary⼤于8000的员⼯,并放置到新的集合⾥。
统计员⼯的最⾼薪资、平均薪资、薪资之和。
将员⼯按薪资从⾼到低排序,同样薪资者年龄⼩者在前。
将员⼯按性别分类,将员⼯按性别和地区分类,将员⼯按薪资是否⾼于8000分为两部分。
⽤传统的迭代处理也不是很难,但代码就显得冗余了,跟Stream相⽐⾼下⽴判。
1 Stream概述
Java 8 是⼀个⾮常成功的版本,这个版本新增的Stream,配合同版本出现的 Lambda ,给我们操作集合(Collection)提供了极⼤的便利。那么什么是Stream?
Stream将要处理的元素集合看作⼀种流,在流的过程中,借助Stream API对流中的元素进⾏操作,⽐如:筛选、排序、聚合等。
Stream可以由数组或集合创建,对流的操作分为两种:
中间操作,每次返回⼀个新的流,可以有多个。
终端操作,每个流只能进⾏⼀次终端操作,终端操作结束后流⽆法再次使⽤。终端操作会产⽣⼀个新的集合或值。
另外,Stream有⼏个特性:
stream不存储数据,⽽是按照特定的规则对数据进⾏计算,⼀般会输出结果。
stream不会改变数据源,通常情况下会产⽣⼀个新的集合或⼀个值。
stream具有延迟执⾏特性,只有调⽤终端操作时,中间操作才会执⾏。
2 Stream的创建
Stream可以通过集合数组创建。
1、通过 java.util.Collection.stream() ⽅法⽤集合创建流
List list = Arrays.asList("a", "b", "c");
// 创建⼀个顺序流
Stream stream = list.stream();
// 创建⼀个并⾏流
Stream parallelStream = list.parallelStream();
2、使⽤java.util.Arrays.stream(T[] array)⽅法⽤数组创建流
int[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);
3、使⽤Stream的静态⽅法:of()、iterate()、generate()
Stream stream = Stream.of(1, 2, 3, 4, 5, 6);
Stream stream2 = Stream.iterate(0, (x) -> x + 3).limit(4);
stream2.forEach(System.out::println); // 0 2 4 6 8 10
Stream stream3 = ate(Math::random).limit(3);
stream3.forEach(System.out::println);
输出结果:
0 3 6 9
0.6796156909271994
0.1914314208854283
0.8116932592396652
stream和parallelStream的简单区分: stream是顺序流,由主线程按顺序对流执⾏操作,⽽parallelStream是并⾏流,内部以多线程并⾏执⾏的⽅式对流进⾏操作,但前提是流中的数据处理没有顺序要求。例如筛选集合中的奇数,两者的处理不同之处:
如果流中的数据量⾜够⼤,并⾏流可以加快处速度。
除了直接创建并⾏流,还可以通过parallel()把顺序流转换成并⾏流:
Optional findFirst = list.stream().parallel().filter(x->x>6).findFirst();
3 Stream的使⽤
在使⽤stream之前,先理解⼀个概念:Optional 。
Optional类是⼀个可以为null的容器对象。如果值存在则isPresent()⽅法会返回true,调⽤get()⽅法会返回该对象。
更详细说明请见:菜鸟教程Java 8 Optional类
接下来,⼤批代码向你袭来!我将⽤20个案例将Stream的使⽤整得明明⽩⽩,只要跟着敲⼀遍代码,就能很好地掌握。
案例使⽤的员⼯类
这是后⾯案例中使⽤的员⼯类:
List personList = new ArrayList();
personList.add(new Person("Tom", 8900, "male", "New York"));
personList.add(new Person("Jack", 7000, "male", "Washington"));
personList.add(new Person("Lily", 7800, "female", "Washington"));
personList.add(new Person("Anni", 8200, "female", "New York"));
personList.add(new Person("Owen", 9500, "male", "New York"));
personList.add(new Person("Alisa", 7900, "female", "New York"));
class Person {
private String name; // 姓名
private int salary; // 薪资
private int age; // 年龄
private String sex; //性别
private String area; // 地区
// 构造⽅法
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;
}
// 省略了get和set,请⾃⾏添加
}
3.1 遍历/匹配(foreach/find/match)
Stream也是⽀持类似集合的遍历和匹配元素的,只是Stream中的元素是以Optional类型存在的。Stream的遍历、匹配⾮常简单。
java中split的用法
// import已省略,请⾃⾏添加,后⾯代码亦是
public class StreamTest {
public static void main(String[] args) {
List list = Arrays.asList(7, 6, 9, 3, 8, 2, 1);
// 遍历输出符合条件的元素
list.stream().filter(x -> x > 6).forEach(System.out::println);
// 匹配第⼀个
Optional findFirst = list.stream().filter(x -> x > 6).findFirst();
// 匹配任意(适⽤于并⾏流)
Optional findAny = list.parallelStream().filter(x -> x > 6).findAny();
// 是否包含符合特定条件的元素
boolean anyMatch = list.stream().anyMatch(x -> x < 6);
System.out.println("匹配第⼀个值:" + ());
System.out.println("匹配任意⼀个值:" + ());
System.out.println("是否存在⼤于6的值:" + anyMatch);
}
}
3.2 筛选(filter)
筛选,是按照⼀定的规则校验流中的元素,将符合条件的元素提取到新的流中的操作。
案例⼀:筛选出Integer集合中⼤于7的元素,并打印出来
public class StreamTest {
public static void main(String[] args) {
List list = Arrays.asList(6, 7, 3, 8, 1, 2, 9);
Stream stream = list.stream();
stream.filter(x -> x > 7).forEach(System.out::println);
}
}
预期结果:
8 9
案例⼆: 筛选员⼯中⼯资⾼于8000的⼈,并形成新的集合。 形成新集合依赖collect(收集),后⽂有详细介绍。
public class StreamTest {
public static void main(String[] args) {
List personList = new ArrayList();
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 fiterList = personList.stream().filter(x -> x.getSalary() > 8000).map(Person::getName)
.List());
System.out.print("⾼于8000的员⼯姓名:" + fiterList);
}
}
运⾏结果:
⾼于8000的员⼯姓名:[Tom, Anni, Owen]
3.3 聚合(max/min/count)
max、min、count这些字眼你⼀定不陌⽣,没错,在mysql中我们常⽤它们进⾏数据统计。Java stream中也引⼊了这些概念和⽤法,极⼤地⽅便了我们对集合、数组的数据统计⼯作。
案例⼀:获取String集合中最长的元素。
public class StreamTest {

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。