Java8新特性
一、Stream流
1. Stream简介
Stream允许我们以声明式的方式处理数据集合,可以将Stream看作是遍历数据集合的高级迭代器。Stream 与Lambda表达式结合使用,将使编码效率大大提高,可读性增强。
注意:Stream与IO中的InputStream/OutputStream是不同的概念
操作案例:使用stream将集合中的手机按照序号num从小到大排序:
结果:
Stream流的操作顺序:
Stream语法:
| stream of elements +-----> |filter+-> |sorted+-> |map+-> |collect|
2. Stream用法
2. 1获取流
- Collection接口下的stream()获取流
List<String> list = new ArrayList<>();
Stream<String> stream = list.stream();
- 使用 Arrays 中的 stream() 方法,将数组转成流
Integer[] arr= new Integer[10];
Stream<Integer> stream = Arrays.stream(arr);
- 使用 Stream 中的静态方法:of()
Stream<Integer> stream = Stream.of(4,3,2,7,5,1,6);
- 使用 BufferedReader.lines() 方法,将每行内容转成流
BufferedReader reader=new BufferedReader(new FileReader("test.txt"));
Stream<String> lineStream = reader.lines();
2.2 流操作
流操作可以分为中间操作和终端操作
List<Apple> apples =
applestore .stream() 获得流
.filter(a -> a.getColor().equals("红色")) 中间操作
.collect(Collectors.toList()); 终端操作
简单来说Stream的流程就是
数据源->中间操作->终端操作->结果
中间操作
- filter():过滤流中的某些元素
- sorted():自然排序,流中元素需实现Comparable接口
- distinct():去除重复元素
- limit(n):获取n个元素
- skip(n):跳过n个元素,配合limit(n)可实现分页
- map():将其映射为一个新的元素
map():
- 对集合中的每一个元素求平方
2.使用map()将String型的整数转为Integer型的整数
终端操作
- forEach():遍历流中的元素
- toArray():将流中的元素倒入一个数组中
- Min():返回流中元素的最小值
- Max():返回流中元素的最大值
- count():返回流中元素的总个数
- reduce():所有元素求和
- anyMatch():接收一个Predicate函数,只要流中有一个元素满足条件则返回true,否则返回false
- allMatch():接收一个Predicate函数,当流中所有元素都符合条件时才返回true,否则返回false
- findFirst():返回流中的第一个元素
- collect():将流中的元素倒入一个集合(Collection/Map)
/**
* 终端操作 -- 结果
*/
Integer[] arr = new Integer[]{
3,1,5,7,2,6,4,4,0};
Object[] arr1 = Arrays.stream(arr)
.distinct()
.sorted()
.toArray(); //toArray()将流中元素倒入Object数组中
//forEach()
Arrays.stream(arr1).forEach(e-> System.out.print(e+" "));
//count 统计
Long count = Arrays.stream(arr).count();
System.out.println(count);
//anyMatch 流中任意一个元素符合条件时返回true
boolean any = Arrays.stream(arr).anyMatch((e)->{
return e>3;});
System.out