Java8之流式使用总结记录
Java8的流式数据处理,方便了集合数据的抽取及计算,不用在写for循环的方式,同时结合Collectors各种方法,现写此文主要是为了记录,提醒自己,工作中,总是容易忘记这些好用的小方法。
filter操作
1.过滤偶数数据集合
List<Integer> nums = new ArrayList<>(); for(int i =0;i<100;i++){ nums.add(i); } // filter 操作 过滤偶数集合 List<Integer> evens = nums.stream().filter(num -> num % 2 == 0).collect(Collectors.toList()); for (int i:evens) { System.out.println("i-->"+i); } // 过滤后数据去重 evens = nums.stream() .filter(num -> num % 2 == 0).distinct() .collect(Collectors.toList()); for (int i:evens) { System.out.println("i-->"+i); }
2、对于一个对象,根据对象某一属性进行筛选
// 初始化 List<Student> students = new ArrayList<Student>() { { add(new Student(20160001, "孔明", 20, 1, "土木工程", "武汉大学")); add(new Student(20160002, "伯约", 21, 2, "信息安全", "武汉大学")); add(new Student(20160003, "玄德", 22, 3, "经济管理", "武汉大学")); add(new Student(20160004, "云长", 21, 2, "信息安全", "武汉大学")); add(new Student(20161001, "翼德", 21, 2, "机械与自动化", "华中科技大学")); add(new Student(20161002, "元直", 23, 4, "土木工程", "华中科技大学")); add(new Student(20161003, "奉孝", 23, 4, "计算机科学", "华中科技大学")); add(new Student(20162001, "仲谋", 22, 3, "土木工程", "浙江大学")); add(new Student(20162002, "鲁肃", 23, 4, "计算机科学", "浙江大学")); add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大学")); } }; // filter 操作 List<Student> whuStudents = students.stream().filter(student -> "土木工程".equals(student.getMajor())).collect(Collectors.toList()); for (Student stu: whuStudents) { System.out.println("stu--"+stu.getName()); }
只返回前2个数据
whuStudents = students.stream().filter(student -> "土木工程".equals(student.getSchool())).limit(2).collect(Collectors.toList()); for (Student stu: whuStudents) { System.out.println("stu--"+stu.getName()); }
对过滤后的结果进行排序,排序收输出
List<Student> sortedCivilStudents = students.stream() .filter(student -> "土木工程".equals(student.getMajor())).sorted((s1, s2) -> s1.getAge() - s2.getAge()) .limit(2) .collect(Collectors.toList()); for (Student stu: sortedCivilStudents) { System.out.println("stu--"+stu.getName()); }
对过滤结果调过前2个
List<Student> civilStudents = students.stream() .filter(student -> "土木工程".equals(student.getMajor())) .skip(2) .collect(Collectors.toList()); for (Student stu: civilStudents) { System.out.println("stu--"+stu.getName()); }
映射操作
对过滤后的结果进行映射收集
List<String> names = students.stream() .filter(student -> "计算机科学".equals(student.getMajor())) .map(Student::getName).collect(Collectors.toList()); for (String name: names) { System.out.println("name--"+name); }
规约计算总和
int totalAge = students.stream() .filter(student -> "计算机科学".equals(student.getMajor())) .mapToInt(Student::getAge).sum();
查找操作
判断集合中条件判断
boolean isAdult = students.stream().allMatch(student -> student.getAge() >= 18);
规约收集
收集得到Int类型数据的 一次性得到元素个数、总和、均值、最大值、最小值,类似的还有summarizingLong summarizingDouble
IntSummaryStatistics statistics = students.stream().collect(Collectors.summarizingInt(Student::getAge));
分组
Map<String, List<Student>> groups = students.stream().collect(Collectors.groupingBy(Student::getSchool)); for(String key : groups.keySet()){ System.out.println(key+"-->"+groups.get(key)); System.out.println("*********************************"); }
流式处理中的很多都适合采用 分而治之 的思想,从而在处理集合较大时,极大的提高代码的性能,java8的设计者也看到了这一点,所以提供了 并行流式处理。上面的例子中我们都是调用stream()方法来启动流式处理,java8还提供了parallelStream()来启动并行流式处理,parallelStream()本质上基于java7的Fork-Join框架实现,其默认的线程数为宿主机的内核数。
主要参考 https://www.cnblogs.com/yadongliang/p/9317982.html
// 初始化
List<Student> students = new ArrayList<Student>() {
{
add(new Student(20160001, "孔明", 20, 1, "土木工程", "武汉大学"));
add(new Student(20160002, "伯约", 21, 2, "信息安全", "武汉大学"));
add(new Student(20160003, "玄德", 22, 3, "经济管理", "武汉大学"));
add(new Student(20160004, "云长", 21, 2, "信息安全", "武汉大学"));
add(new Student(20161001, "翼德", 21, 2, "机械与自动化", "华中科技大学"));
add(new Student(20161002, "元直", 23, 4, "土木工程", "华中科技大学"));
add(new Student(20161003, "奉孝", 23, 4, "计算机科学", "华中科技大学"));
add(new Student(20162001, "仲谋", 22, 3, "土木工程", "浙江大学"));
add(new Student(20162002, "鲁肃", 23, 4, "计算机科学", "浙江大学"));
add(new Student(20163001, "丁奉", 24, 5, "土木工程", "南京大学"));
}
};
// filter 操作
List<Student> whuStudents = students.stream().filter(student -> "土木工程".equals(student.getMajor())).collect(Collectors.toList());
for (Student stu: whuStudents) {
System.out.println("stu--"+stu.getName());
}

浙公网安备 33010602011771号