这是我参与更文挑战的第6天,活动详情查看: 更文挑战
今天简单介绍下java 8中非常好用的一种数据处理方式,流Stream。
每个人在开发过程中应该都用到过,实用性简直太强了。基本上用来操作集合、数组的筛选、 排序、聚合等等是完全没问题的。
目录
一、什么是Stream?
二、生成流
三、Stream的方法
四、流的中间操作
五、统计案例
一、什么是Stream?
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 是用一种直观的方式对Java集合进行运算和表达,类似SQL语句从数据库查询数据。
int sum = widgets.stream()
.filter(w -> w.getColor() == RED)
.mapToInt(w -> w.getWeight())
.sum();
Stream(流)的特点:
-
Stream并不会存储元素,而是按需计算。
-
数据源 是流的来源,它可以是集合,数组,I/O channel, 产生器generator 等。
-
聚合操作 比如filter, map, reduce, find, match, sorted等。
二、生成流
在 Java 8 中, 集合接口有两个方法来生成流:
- stream() − 取得集合对象的数据集。
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream(); //获取一个顺序流
Stream<String> parallelStream = list.parallelStream(); //获取一个并行流
- parallelStream() − 为集合创建并行流。
三、Stream的方法
forEach
遍历数据
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 3).limit(5);//获取0-x之间的5个元素,x为x+3
stream2.forEach(System.out::println); // 0 3 6 9 12
filter
过滤流中的某些元素
List<String>strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
long count = strings.stream().filter(string -> string.isEmpty()).count();//过滤为空的字符的数量
limit
获取n个元素
Stream<Integer> stream2 = Stream.iterate(0, (x) -> x + 2).limit(6);//获取6个元素
stream2.forEach(System.out::println); // 0 2 4 6 8 10
sorted
自然排序,流中元素需实现Comparable接口
List<String> list = Arrays.asList("aa", "ff", "dd");
*//String 类自身已实现Compareable接口*
list.stream().sorted().forEach(System.out::println);
四、流的中间操作
筛选与切片
**filter**:过滤流中的某些元素
**distinct:**通过流中元素的 hashCode() 和 equals() 去除重复元素
Stream<Integer> stream = Stream.of( 7, 12, 9, 8, 10, 12, 14, 14);
Stream<Integer> newStream = stream.filter(s -> s > 9) //12、10、12、14、14
.distinct() //去重 12、10、14
newStream.forEach(System.out::println);
映射
map:将每个元素经过指定函数计算后,转变为新的元素
flatMap:将每个元素经过特定函数转换成新的流,并连接在一起。
List<String> list = Arrays.asList("a,b,c", "1,2,3");
Stream<String> s1 = list.stream().map(s -> s.replaceAll(",", ""));//将每个元素中的逗号去掉
s1.forEach(System.out::println); // abc 123
Stream<String> s3 = list.stream().flatMap(s -> {
String[] split = s.split(",");
Stream<String> s2 = Arrays.stream(split);
return s2;
});
s3.forEach(System.out::println); // a b c 1 2 3
五、统计案例
另外,Stream也可以作为统计结果的手段。主要用于int、double、long等基本类型上,可以进行如下操作:
List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("列表中最大的数 : " + stats.getMax());
System.out.println("列表中最小的数 : " + stats.getMin());
System.out.println("所有数之和 : " + stats.getSum());
System.out.println("平均数 : " + stats.getAverage());