Stream的一些使用方法
一:常见数据源获取流对象
1、集合
List<String> strings = new ArrayList<>();
strings.add("hello");
strings.add("world");
Stream<String> stream = strings.stream();
2、数组
String[] names = {"chaimm","peter","john"};
Stream<String> stream = Arrays.stream(names);
Integer[] nums = new Integer[10];
Stream<Integer> stream = Arrays.stream(nums);
3、值
Stream<String> stream = Stream.of("chaimm","peter","john");
4、IO流
try(Stream lines = Files.lines(Paths.get(“文件路径名”),Charset.defaultCharset())){
//可对lines做一些操作
}catch(IOException e){
}
二:常见方法操作
1.filter过滤
List<User> result = list.stream()
.filter(User::isUser)
.collect(toList());
List<User> result = list.stream()
.filter(i-> i.getAge()<18)
.collect(Collectors.toList());
2.map映射
// 获取制定列
//获取所有学生的姓名,并形成一个新的集合
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(1,19,"张三","M",true));
students.add(new Student(1,18,"李四","M",false));
students.add(new Student(1,21,"王五","F",true));
students.add(new Student(1,20,"赵六","F",false));
List<String> collect = students.stream().map(Student::getName).collect(Collectors.toList());
collect.forEach(s -> System.out.print(s + " "));
// 结果:张三 李四 王五 赵六
3.limit截取
// 截取数据源的前两个元素
List<String> strings = stream.limit(2).collect(Collectors.toList());
4.skip跳过
// 跳过数据源的前两个元素
List<String> collect = stream.skip(2).collect(Collectors.toList());
5.基于anyMatch()判断条件至少匹配一个元素
//判断集合中是否有年龄小于20的学生
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(1,19,"张三","M",true));
students.add(new Student(1,18,"李四","M",false));
students.add(new Student(1,21,"王五","F",true));
students.add(new Student(1,20,"赵六","F",false));
if(students.stream().anyMatch(student -> student.getAge() < 20)){
System.out.println("集合中有年龄小于20的学生");
}else {
System.out.println("集合中没有年龄小于20的学生");
}
5.2:是否未匹配所有元素:noneMatch
noneMatch与allMatch恰恰相反,它用于判断流中的所有元素是否都不满足指定条件:
boolean result = list.stream()
.noneMatch(Person::isStudent);
6.findAny()随机返回一个元素与findFirst()返回第一个元素
findAny能够从流中随便选一个元素出来,它返回一个Optional类型的元素。
//findAny用于获取流中随机的某一个元素,并且利用短路在找到结果时,立即结束
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(1,19,"张三1","M",true));
students.add(new Student(1,18,"张三2","M",false));
students.add(new Student(1,21,"张三3","F",true));
students.add(new Student(1,20,"张三4","F",false));
students.add(new Student(1,20,"张三5","F",false));
students.add(new Student(1,20,"张三6","F",false));
Optional<Student> student1 = students.stream().filter(student -> student.getSex().equals("F")).findAny();
System.out.println(student1.toString());
7.reduce()进行累积求和
Integer reduce = integers.stream().reduce(0,Integer::sum);
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 4, 5, 5, 6, 7, 8, 2, 2, 2, 2);
Integer reduce = integers.stream().reduce(0, (integer1, integer2) -> integer1 + integer2);
8.获取流中元素的最大值、最小值
List<Integer> integers = Arrays.asList(1, 2, 3, 4, 4, 5, 5, 6, 7, 8, 2, 2, 2, 2);
/**
* 获取集合中的最大值
*/
//方法一
Optional<Integer> max1 = integers.stream().reduce(Integer::max);
if(max1.isPresent()){
System.out.println(max1);
}
//方法二
Optional<Integer> max2 = integers.stream().max(Integer::compareTo);
if(max2.isPresent()){
System.out.println(max2);
}
/**
* 获取集合中的最小值
*/
//方法一
Optional<Integer> min1 = integers.stream().reduce(Integer::min);
if(min1.isPresent()){
System.out.println(min1);
}
//方法二
Optional<Integer> min2 = integers.stream().min(Integer::compareTo);
if(min2.isPresent()){
System.out.println(min2);
}
9.收集器
ArrayList<Student> students = new ArrayList<>();
students.add(new Student(1,19,"张三","M",true));
students.add(new Student(1,18,"李四","M",false));
students.add(new Student(1,21,"王五","F",true));
students.add(new Student(1,20,"赵六","F",false));
//通过counting()统计集合总数 方法一
Long collect = students.stream().collect(Collectors.counting());
System.out.println(collect);
//结果 4
//通过count()统计集合总数 方法二
long count = students.stream().count();
System.out.println(count);
//结果 4
//通过maxBy求最大值
Optional<Student> collect1 = students.stream().collect(Collectors.maxBy(Comparator.comparing(Student::getAge)));
if(collect1.isPresent()){
System.out.println(collect1);
}
//结果 Optional[Student{id=1, age=21, name='王五', sex='F', isPass=true}]
//通过max求最大值
Optional<Student> max = students.stream().max(Comparator.comparing(Student::getAge));
if(max.isPresent()){
System.out.println(max);
}
//结果 Optional[Student{id=1, age=21, name='王五', sex='F', isPass=true}]
//通过minBy求最小值
Optional<Student> collect2 = students.stream().collect(Collectors.minBy(Comparator.comparing(Student::getAge)));
if(collect2.isPresent()){
System.out.println(collect2);
}
//结果 Optional[Student{id=1, age=18, name='李四', sex='M', isPass=false}]
//通过min求最小值
Optional<Student> min = students.stream().min(Comparator.comparing(Student::getAge));
if(min.isPresent()){
System.out.println(min);
}
//结果 Optional[Student{id=1, age=18, name='李四', sex='M', isPass=false}]
//通过summingInt()进行数据汇总
Integer collect3 = students.stream().collect(Collectors.summingInt(Student::getAge));
System.out.println(collect3);
//结果 78
//通过averagingInt()进行平均值获取
Double collect4 = students.stream().collect(Collectors.averagingInt(Student::getAge));
System.out.println(collect4);
//结果 19.5
//通过joining()进行数据拼接
String collect5 = students.stream().map(Student::getName).collect(Collectors.joining());
System.out.println(collect5);
//结果 张三李四王五赵六
//复杂结果的返回
IntSummaryStatistics collect6 = students.stream().collect(Collectors.summarizingInt(Student::getAge));
double average = collect6.getAverage();
long sum = collect6.getSum();
long count1 = collect6.getCount();
int max1 = collect6.getMax();
int min1 = collect6.getMin();
10.分组
简单分组:
//通过性别对学生进行分组
Map<String, List<Student>> collect = students.stream().collect(Collectors.groupingBy(Student::getSex));
结果 {
F=[Student{id=1, age=21, name='王五', sex='F', isPass=true}, Student{id=1, age=20, name='赵六', sex='F', isPass=false}],
M=[Student{id=1, age=19, name='张三', sex='M', isPass=true}, Student{id=1, age=18, name='李四', sex='M', isPass=false}]
}
复杂分组
//现根据是否通过考试对学生分组,在根据性别分组
Map<String, Map<Boolean, List<Student>>> collect1 = students.stream().collect(Collectors.groupingBy(Student::getSex, Collectors.groupingBy(Student::getPass)));
结果: {
F={
false=[Student{id=1, age=20, name='赵六', sex='F', isPass=false}],
true=[Student{id=1, age=21, name='王五', sex='F', isPass=true}]
},
M={
false=[Student{id=1, age=18, name='李四', sex='M', isPass=false}],
true=[Student{id=1, age=19, name='张三', sex='M', isPass=true}]}
}
多级分组变形
//根据年龄进行分组,获取并汇总人数
Map<Integer, Long> collect2 = students.stream().collect(Collectors.groupingBy(Student::getAge, Collectors.counting()));
System.out.println(collect2);
结果:{18=1, 19=1, 20=1, 21=1}
//要根据年龄与是否及格进行分组,并获取每组中年龄的学生
Map<Integer, Map<Boolean, Student>> collect3 = students.stream().collect(Collectors.groupingBy(Student::getAge, Collectors.groupingBy(Student::getPass,
Collectors.collectingAndThen(Collectors.maxBy(Comparator.comparing(Student::getAge)), Optional::get))));
System.out.println(collect3.toString());
结果:{
18={false=Student{id=1, age=18, name='李四', sex='M', isPass=false}},
19={true=Student{id=1, age=19, name='张三', sex='M', isPass=true}},
20={false=Student{id=1, age=20, name='赵六', sex='F', isPass=false}},
21={true=Student{id=1, age=21, name='王五', sex='F', isPass=true}}}
11.获取最大值
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
Integer max = list.stream().max(Integer::compareTo).get();
System.out.println(max);
12.获取最小值
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
Integer min = list.stream().min(Integer::compareTo).get();
System.out.println(min);
13.任意条件
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
boolean res = list.stream().anyMatch(i -> i > 5);
System.out.println(res);
14:map映射-将对象某个属性取出,并合并
String res = list.stream().map(pre::getName).collect(Collectors.joining("--"));
System.out.println(res);
15.排序
// 简单排序
List<Integer> list = Arrays.asList(1, 2, 3, 7, 5, 6, 6, 4);
List<Integer> res = list.stream().sorted().collect(Collectors.toList());
System.out.println(res);
// 指定字段正序排序
List<pre> res=list.stream().sorted(Comparator.comparing(pre::getAge)).collect(Collectors.toList());
System.out.println(res);
// 指定字段倒序排序
List<pre> sortReverseRlt=list.stream().sorted(Comparator.comparing(pre::getAge).reversed()).collect(Collectors.toList());
System.out.println(res);