1、过滤
filter:过滤流中的某些元素
List<Integer> collect = Arrays.asList(1, 2, 3, 5, 5).stream().filter(integer -> integer > 2).collect(Collectors.toList());
2、去重
sorted():返回由此流的元素组成的流,根据自然顺序排序
List<Integer> collect1 = Arrays.asList(1, 1, 2, 2, 3, 4, 5).stream().distinct().collect(Collectors.toList());
或
Set<Integer> collect2 = Arrays.asList(1, 1, 2, 2, 3, 4, 5).stream().collect(Collectors.toSet());
3、排序
sorted():返回由此流的元素组成的流,根据自然顺序排序
// 数字升序
List<Integer> collect3 = Arrays.asList(3, 1, 1, 2, 4, 5).stream().sorted().collect(Collectors.toList());
// 数字倒序
List<Integer> collect4 = Arrays.asList(3, 1, 1, 2, 4, 5).stream().sorted((a, b) -> b - a).collect(Collectors.toList());
// 可以根据排序结果获取最值
Integer integer = Arrays.asList(1, 1, 2, 2, 3, 4, 5).stream().sorted().findFirst().get();
//按照大小(a-z)排序
Arrays.asList("java","c#","python","scala").stream().sorted().forEach(System.out::println);
//按照长度排序
Arrays.asList("java","c#","python","scala").stream().sorted((a,b)->a.length()-b.length()).forEach(System.out::println);
4、截取
limit(n):返回由此流的元素组成的流,截短长度不能超过 skip(n):在丢弃流的第n元素后,配合limit(n)可实现分页
List<Integer> collect5 = Arrays.asList(1, 2, 3, 4, 5).stream().skip(1).limit(2).collect(Collectors.toList());
// 输出 2,3
5、转换
map:接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。flatMap:接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
// 给每个元素+1
List<Integer> collect6 = Arrays.asList(1, 2, 3, 4, 5).stream().map(integer1 -> integer1 + 1).collect(Collectors.toList());
6、分组
List<PersonDo> list=new ArrayList<>();
list.add(new PersonDo("藏三",18,"男",167L,60L));
list.add(new PersonDo("李肆",18,"未知",180L,100L));
list.add(new PersonDo("王武",19,"女",172L,55L));
// 根据年龄分组
Map<Integer, List<PersonDO>> collect7 = list.stream().collect(Collectors.groupingBy(personDO -> personDO.getAge()));
分组可以用来统计聚合中元素重复个数,很方便
//我们之前统计个数一般喜欢用map去统计
List<String> arr = new ArrayList<>();
arr.add("a");
arr.add("a");
arr.add("b");
arr.add("b");
list.forEach(s -> {
Integer count = countMap.get(s);
countMap.put(s, ObjectUtils.isEmpty(count) ? 1 : ++count);
});
// 现在用stream更方便
List<String> arr = new ArrayList<>();
arr.add("a");
arr.add("a");
arr.add("b");
arr.add("b");
Map<String, Long> collect = arr.stream().collect(Collectors.groupingBy(s -> s, Collectors.counting()));
7、取值
开发中经常调用接口获取了一个对象列表,但是仅仅需要对象的其中的一两个元素
List<PersonDo> list=new ArrayList<>();
list.add(new PersonDo("藏三",17,"男",167L,60L));
list.add(new PersonDo("李肆",18,"未知",180L,100L));
list.add(new PersonDo("王武",19,"女",172L,55L));
// 取一个元素
List<String> nameList = list.stream().map(PersonDo::getName).collect(Collectors.toList());
// 取两个元素
Map<String, Integer> nameAndAgeList = list.stream().collect(Collectors.toMap(PersonDo::getName, PersonDo::getAge));
8、计算
//求和
String str ="11,22,33,44,55";
System.out.println(Stream.of(str.split(",")).mapToInt(x -> Integer.valueOf(x)).sum());