-
stream() − 为集合创建串行流。
-
parallelStream() − 为集合创建并行流。
1.过滤filter(T->boolean),保留boolean为true的元素。
list.stream().filter(user->user.getAge()>20).collect(Collectors.toList())
保留年龄大于20的用户数据流,再将其转换为List。
2.去重distinct(),去除重复元素,这个方法是通过类的equals方法来判断两个元素是否相等,需要对原有元素重写equals方法。
list.strean().distinct().collect(Collectors.toList());
3.排序sorted()/sorted((T,T)->int),如果流中的元素的类实现了Comparable接口,直接可以排序,否则可以在sorted()中加入排序规则。
list.strean().sorted().collect(Collectors.toList());
4.截取前n个元素limit(long n)
list.stream().limit(5).collect(Collectors.toList());
截取前5个元素。
5.去除前n个元素skip(long n)
list.stream().skip(2);
去除前两个元素。
6.将T映射为R,map(T->R)
在map中可以对每个元素进行操作;类似遍历对元素操作。
String department="技术部";
list
.stream()
.map(user->
User newUser=new User();
newUser.setName(user.getName());
newUser.setDepartment(department);
newUser.setAge(user.getAge());
return newUser;
)
.collect(Collectors.toList());
可以将元素的某个元素提取为一个新的集合。
7.将多个流合并为一个流 flatMap()
8.是否存在给定的条件T->boolean,anyMatch(T->boolean)
boolean isAt =list.stream().anyMatch(user -> user.getAge() == 20);
流中不存在元素给定的T->boolean
findAny():找到其中一个元素(使用Stream时找到的是第一个元素;使用parallelStream()并行时找到的是其中一个元素)
findFirst():找到第一个元素
9.组合流中的元素,求和,求积,最大值等
reduce((T,T)->T),reduce(T(T,T)->T)
//计算年龄总和:
int sum = list.stream().map(Person::getAge).reduce(0, (a, b) -> a + b);
//与之相同:
int sum = list.stream().map(Person::getAge).reduce(0, Integer::sum);
0代表起始值为0,如果求积只需要将+改为*;
10.收集方法collect()
list.stream().collect(toList()),list.stream().collect(toSet()) , list.strean().collect(Collectors.toMap(User::getID,User::getName)),,,
还可以分组求和等
Map<String, Integer> collect2 = list
.stream()
.collect(
Collectors.groupingBy(
list::getMethed1,
Collectors.summingInt(T->Integer.parseInt(list.getMethed2()))
)
);
根据Methed1分组,根据Methed2求和。
11.遍历
list.strean().forEach();
12.返回流中元素个数count
一般与过滤一起使用,计算符条件流中的元素个数。
13.统计,mapToInt
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());
14.遍历树形结构
/**
* 获取父节点
* @param trees
* @return List
*/
public static List<PermissionVo> makeTree(List<PermissionVo> trees) {
if (!CollectionUtils.isEmpty(trees)) {
return trees.stream().filter(m -> m.getParentId() == 0).peek(
(m) -> m.setChildren(getChildrenList(m, trees))
).collect(Collectors.toList());
}
return null;
}
/**
* 获取子节点列表
* @param tree
* @param trees
* @return List
*/
private static List<PermissionVo> getChildrenList(PermissionVo tree, List<PermissionVo> trees) {
List<PermissionVo> collect = trees.stream().filter(item -> Objects.equals(item.getParentId(), tree.getId())).peek(
(item) -> item.setChildren(getChildrenList(item, trees))
).collect(Collectors.toList());
if(!CollectionUtils.isEmpty(collect)){
return collect;
}
return null;
}