(1)、创建Stream :一个数据源(如:集合、数组),获取一个流
(2)、中间操作: 一个中间操作链,对数据源的数据进行处理
(3)、终止操作(终端操作): 一个终止操作,执行中间操作链,并产生结果
1、生成流
// 由Collection创建流
List<String> list = new ArrayList<>();
Stream<String> stream1 = list.stream();
// 由数组创建流
Employee[] emps = new Employee[10];
Stream<Employee> stream2 = Arrays.stream(emps);
2、中间操作
- filter--接收 Lambda,从流中排除某些元素
private static List<User> initList() {
List<User> userList = new ArrayList<>();
userList.add(new User("1", "xiaom", 18, 3500, "0"));
userList.add(new User("2", "shany", 20, 13500, "0"));
userList.add(new User("3", "damao", 35, 7000, "0"));
userList.add(new User("4", "guoer", 17, 6500, "1"));
userList.add(new User("5", "longn", 18, 4500, "0"));
userList.add(new User("6", "guoer", 25, 9200, "1"));
return userList;
}
List<User> userList = initList();
userList.stream()
.filter((e) -> e.getAge() > 18)
.forEach(System.out::println);
// 结果
User{id='2', name='shany', age=20, status=0}
User{id='3', name='damao', age=35, status=0}
User{id='6', name='guoer', age=25, status=1}
limit
--截断流,使其元素不超过给定数量
userList.stream()
.filter((e) -> e.getAge() > 18)
.limit(2)
.forEach(System.out::println);
// 结果
User{id='2', name='shanyu', age=20, status=0}
User{id='3', name='damao', age=35, status=0}
skip(n)
--跳过元素,返回一个扔掉了前n个元素的流
userList.stream()
.filter((e) -> e.getAge() > 18)
.skip(1)
.limit(1)
.forEach(System.out::println);
// 结果
User{id='3', name='damao', age=35, status=0}
distinct
--筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
userList.stream()
.distinct()
.forEach(System.out::println);
// 结果,去重name=guoer
User{id='1', name='xiaoming', age=18, status=0}
User{id='2', name='shanyu', age=20, status=0}
User{id='3', name='damao', age=35, status=0}
User{id='4', name='guoer', age=17, status=1}
User{id='5', name='longnv', age=18, status=0}
map
--接收Lambda,将元素转换成其他形式或提取信息。接收一个函数作为参数,该函数会被应用到每个元素上,返回新元素。
userList.stream()
.map(User::getName)
.forEach(System.out::println);
//结果
XIAOMING SHANYU DAMAO GUOER LONGNV GUOER
- peek--返回由该流的元素组成的流,并对每个元素执行所提供的
Consumer
操作方法。
userList.stream()
.peek(e -> e.setName(e.getName().toUpperCase()))
.forEach(System.out::println);
// 结果
User{id='1', name='XIAOMING', age=18, status=0}
User{id='2', name='SHANYU', age=20, status=0}
User{id='3', name='DAMAO', age=35, status=0}
User{id='4', name='GUOER', age=17, status=1}
User{id='5', name='LONGNV', age=18, status=0}
User{id='6', name='GUOER', age=25, status=1}
sorted(Comparator com)
----定制排序(Comparator)
List<String> list = Arrays.asList("ccc", "aaa", "bbb", "ddd", "eee");
list.stream()
.sorted()
.forEach(System.out::println);
System.out.println("=======定制排序=========");
List<User> userList = initList();
userList.stream()
.sorted((x, y) -> {
if (x.getAge() == y.getAge()) {
return x.getName().compareTo(y.getName());
} else {
return Integer.compare(x.getAge(), y.getAge());
}
}).forEach(System.out::println);
// 结果
aaa
bbb
ccc
ddd
eee
=======定制排序=========
User{id='4', name='guoer', age=17, status=1}
User{id='5', name='longnv', age=18, status=0}
User{id='1', name='xiaoming', age=18, status=0}
User{id='2', name='shanyu', age=20, status=0}
User{id='6', name='guoer', age=25, status=1}
User{id='3', name='damao', age=35, status=0}
3、终止操作
allMatch
——检查是否匹配所有元素anyMatch
——检查是否至少匹配一个元素noneMatch
——检查是否没有匹配的元素findFirst
——返回第一个元素findAny
——返回当前流中的任意元素count
——返回流中元素的总个数max
——返回流中最大值min
——返回流中最小值reduce(T identity, BinaryOperator) / reduce(BinaryOperator)
——可以将流中元素反复结合起来,得到一个值。- Collector接口中方法的实现决定了如何对流执行收集操作(如收集到List、Set、Map)。但是Collectors实用类提供了很多静态方法,可以方便地创建常见收集器实例,具体方法与实例如下表
方法 | 返回类型 | 作用 |
toList | List<T> | 把流中元素收集到List |
toSet | Set<T> | 把流中元素收集到Set |
toCollection | Conllection<T> | 把流中元素收集到创建的集合 |
counting | Long | 计算流元素中的个数 |
summingInt | Integer | 对流中元素的整数属性求和 |
avargingInt | Double | 计算流中元素Integer属性的平均值 |
summarizingInt | IntSummaryStatistics | 收集流中Integer属性的统计值,如平均值 |
joining | String | 连接流中的每个字符串 |
maxBy | Optional<T> | 根据比较器选择最大值 |
minBy | Optional<T> | 根据比较器选择最小值 |
reducing | 归约产生的类型 | 从一个作为累加器的初始值开始,利用BinaryOperator与流中元素逐个结合,从而归约成单个值 |
collectingAndThen | 转换函数返回的类型 | 包裹另一个收集器,对其结果转换函数 |
groupingBy | Map<K, List<T>> | 根据某属性值对流分组,属性为K,结果为V |
partitioningBy | Map<Boolean, List<T>> | 根据true或者false进行分区 |