简单的集合遍历

foreach遍历

  1. import java.util.ArrayList;
  2. import java.util.List;
  3.  
  4. /**
  5. * @author rx
  6. * @date 2022/6/1 17:18
  7. */
  8. public class Demo1Foreach {
  9. public static void main(String[] args) {
  10. List<String>list=new ArrayList<>();
  11. list.add("w2");
  12. list.add("zh3");
  13. list.add("l4");
  14. list.add("lao6");
  15. list.add("tomas");
  16. for (String s:list){
  17. System.out.println(s);
  18. }
  19. }
  20. }

  迭代器遍历

  1. import java.util.ArrayList;
  2. import java.util.Iterator;
  3. import java.util.List;
  4.  
  5. /**
  6. * @author rx
  7. * @date 2022/6/1 17:18
  8. */
  9. public class Demo1Foreach {
  10. public static void main(String[] args) {
  11. List<String>list=new ArrayList<>();
  12. list.add("w2");
  13. list.add("zh3");
  14. list.add("l4");
  15. list.add("lao6");
  16. list.add("tomas");
  17. Iterator<String> iterator = list.iterator();
  18. while (iterator.hasNext()){
  19. System.out.println(iterator.next()+"\t");
  20. }
  21. }
  22. }

 有以下场景

  1. 将集合A根据条件一过滤为子集B;
  2. 然后再根据条件二过滤为子集C。

先使用Java8以前的做法

  1. import java.util.ArrayList;
  2. import java.util.Arrays;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.stream.Collectors;
  6.  
  7. /**
  8. * @author rx
  9. * @date 2022/6/1 17:18
  10. */
  11. public class Demo1Foreach {
  12. public static void main(String[] args) {
  13.  
  14. List<String>list=new ArrayList<>();
  15. List<String>listA=new ArrayList<>();
  16. List<String>listB=new ArrayList<>();
  17. list.add("w2");
  18. list.add("zh3");
  19. list.add("l4");
  20. list.add("lao6");
  21. list.add("tomas");
  22. for (String s:list){
  23. if (s.startsWith("l")){
  24. listA.add(s);
  25. }
  26. }
  27. for (String s:listA){
  28. if (s.length()==4){
  29. listB.add(s);
  30. }
  31. }
  32. for (String s:listB){
  33. System.out.println(s);
  34. }
  35. }
  36. }

  使用Stream()流更优的写法

1.场景一:筛选

1.1 基于filter()实现数据过滤

该方法会接收一个返回boolean的函数作为参数,终返回一个包括所有符合条件元素的流。

  1. import jdk.nashorn.internal.ir.IfNode;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8.  
  9. /**
  10. * @author rx
  11. * @date 2022/6/1 17:18
  12. */
  13. public class StreamDemo1 {
  14. public static void main(String[] args) {
  15.  
  16. List<String>list=new ArrayList<>();
  17. List<String>listA=new ArrayList<>();
  18. List<String>listB=new ArrayList<>();
  19. list.add("w2");
  20. list.add("zh3");
  21. list.add("l4");
  22. list.add("lao6");
  23. list.add("tomas");
  24. list.stream().filter(
  25. name->name.startsWith("l")
  26. ).filter(
  27. name->name.length()==4
  28. ).forEach(name-> System.out.println(name));
  29. }
  30. }

  

  1. import jdk.nashorn.internal.ir.IfNode;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8. import java.util.stream.Stream;
  9.  
  10. /**
  11. * @author rx
  12. * @date 2022/6/1 17:18
  13. */
  14. public class StreamDemo2 {
  15. public static void main(String[] args) {
  16. List<Student>students=new ArrayList<>();
  17. students.add(new Student("wang2",5,"f"));
  18. students.add(new Student("zh3",3,"f"));
  19. students.add(new Student("li4",5,"f"));
  20.  
  21. students.stream().filter(student ->
  22. student.getName().length() == 3
  23. && student.getAge() < 5
  24. ).forEach(System.out::println);
  25. }
  26. }
  27.  
  28. class Student {
  29. public Student(String name, int age, String gender) {
  30. this.name = name;
  31. this.age = age;
  32. this.gender = gender;
  33. }
  34.  
  35. public String getName() {
  36. return name;
  37. }
  38.  
  39. public void setName(String name) {
  40. this.name = name;
  41. }
  42.  
  43. @Override
  44. public String toString() {
  45. return "Student{" +
  46. "name='" + name + '\'' +
  47. ", age=" + age +
  48. ", gender='" + gender + '\'' +
  49. '}';
  50. }
  51.  
  52. public int getAge() {
  53. return age;
  54. }
  55.  
  56. public void setAge(int age) {
  57. this.age = age;
  58. }
  59.  
  60. public String getGender() {
  61. return gender;
  62. }
  63.  
  64. public void setGender(String gender) {
  65. this.gender = gender;
  66. }
  67.  
  68. private String name;
  69. private int age;
  70. private String gender;
  71.  
  72. }

 1.2基于distinct实现数据去重

  1. import java.util.Arrays;
  2. import java.util.List;
  3.  
  4. /**
  5. * @author rx
  6. * @date 2022/6/3 10:04
  7. */
  8. public class StreamDemo3 {
  9. public static void main(String[] args) {
  10. List<Integer> numbers = Arrays.asList(1, 2, 4, 5, 3, 2, 1, 3, 4, 5, 6, 5, 7, 8);
  11. numbers.stream().distinct().forEach(System.out::println);
  12. }
  13. }

  在distinct()内部是基于LinkedHashSet对流中数据进行去重,并终返回一个新的流。

2.切片

2.1基于limit()实现数据截取

  1. import java.util.Arrays;
  2. import java.util.List;
  3.  
  4. /**
  5. * @author rx
  6. * @date 2022/6/3 10:04
  7. */
  8. public class StreamDemo5 {
  9. public static void main(String[] args) {
  10. List<Integer> numbers = Arrays.asList(1, 2, 4, 5, 3, 2, 1, 3, 4, 5, 6, 5, 7, 8);
  11. numbers.stream().limit(3).forEach(System.out::println);
  12. }
  13. }

2.2基于skip()实现数据跳过

  1. import java.util.Arrays;
  2. import java.util.List;
  3.  
  4. /**
  5. * @author rx
  6. * @date 2022/6/3 10:04
  7. */
  8. public class StreamDemo6 {
  9. public static void main(String[] args) {
  10. List<Integer> numbers = Arrays.asList(1, 2, 4, 5, 3, 2, 1, 3, 4, 5, 6, 5, 7, 8);
  11. numbers.stream().skip(3).forEach(System.out::println);
  12. }
  13. }

 3.映射

在Stream API中也提供了类似的方法,map()。它接收一个函数作为方法参数,这个函数会被应用到集合中每一个 元素上,并终将其映射为一个新的元素。 案例:获取所有学生的姓名,并形成一个新的集合。

  1. public class StreamDemo7 {
  2. public static void main(String[] args) {
  3. List<Student>students=new ArrayList<>();
  4. students.add(new Student("wang2",5,"f"));
  5. students.add(new Student("zh3",3,"f"));
  6. students.add(new Student("li4",5,"f"));
  7.  
  8. List<String> stringList = students.stream().map(student -> student.getName()).collect(Collectors.toList());
  9. stringList.stream().forEach(System.out::println);
  10.  
  11. }
  12. }

4、匹配

boolean anyMatch()、boolean allMatch()、boolean noneMatch()方法。

  1. import jdk.nashorn.internal.ir.IfNode;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.Arrays;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.stream.Collectors;
  8. import java.util.stream.Stream;
  9.  
  10. /**
  11. * @author rx
  12. * @date 2022/6/1 17:18
  13. */
  14. public class StreamDemo8 {
  15. public static void main(String[] args) {
  16. List<Student>students=new ArrayList<>();
  17. students.add(new Student("wang2",5,"f"));
  18. students.add(new Student("zh3",3,"f"));
  19. students.add(new Student("li4",5,"f"));
  20.  
  21. if (students.stream().allMatch(student -> student.getAge()<5)){
  22. System.out.println("have ");
  23. }else {
  24. System.out.println("don't");
  25. }
  26. }
  27. }

5.查找

对于集合操作,有时需要从集合中查找中符合条件的元素,Stream中也提供了相关的API,findAny()和 findFirst(),他俩可以与其他流操作组合使用。findAny用于获取流中随机的某一个元素,findFirst用于获取流中的 第一个元素。至于一些特别的定制化需求,则需要自行实现。

5.1基于findAny()查找元素

案例:findAny用于获取流中随机的某一个元素,并且利用短路在找到结果时,立即结束

  1. public class StreamDemo9 {
  2. public static void main(String[] args) {
  3. List<Student>students=new ArrayList<>();
  4. students.add(new Student("wang2",5,"f"));
  5. students.add(new Student("zh3",3,"f"));
  6. students.add(new Student("li4",5,"f"));
  7. Optional<Student> optionalStudent = students.stream().filter(student -> student.getName().length() == 3).findAny();
  8. System.out.println(optionalStudent.toString());
  9.  
  10. }
  11. }

5.2基于findFirst()查找元素

findFirst使用原理与findAny类似,只是它无论串行流还是并行流都会返回第一个元素

6、归约

到现在截止,对于流的终端操作,我们返回的有boolean、Optional和List。但是在集合操作中,我们经常会涉及 对元素进行统计计算之类的操作,如求和、求大值、小值等,从而返回不同的数据结果。

6.1基于reduce()进行累积求和

  1. import java.util.Arrays;
  2. import java.util.List;
  3.  
  4. /**
  5. * @author rx
  6. * @date 2022/6/3 13:34
  7. */
  8. public class StreamDemo10 {
  9. public static void main(String[] args) {
  10. List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
  11. Integer reduce = list.stream().reduce(0, (x1, x2) -> x1 + x2);
  12. System.out.println(reduce);
  13. }
  14. }

  在上述代码中,在reduce里的第一个参数声明为初始值,第二个参数接收一个lambda表达式,代表当前流中的两 个元素,它会反复相加每一个元素,直到流被归约成一个终结果

  1. import java.util.Arrays;
  2. import java.util.List;
  3. import java.util.Optional;
  4.  
  5. /**
  6. * @author rx
  7. * @date 2022/6/3 13:34
  8. */
  9. public class StreamDemo11 {
  10. public static void main(String[] args) {
  11. List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
  12. Optional<Integer> reduce = list.stream().reduce(Integer::sum);
  13. if (reduce.isPresent()){
  14. System.out.println(reduce);
  15. }else
  16. System.out.println("data is error");
  17. }
  18. }

6.2 获取流中的最大值最小值

  1. public class StreamDemo12 {
  2. public static void main(String[] args) {

  3. List<Integer> integers = Arrays.asList(1, 2, 3, 4, 4, 5, 5, 6, 7, 8, 2, 2, 2, 2);

  4. /**
  5. * 获取集合中的最大值
  6. */
  7. //方法一
  8. Optional<Integer> max1 = integers.stream().reduce(Integer::max);
  9. if(max1.isPresent()){
  10. System.out.println(max1);
  11. }
  12. //方法二
  13. Optional<Integer> max2 = integers.stream().max(Integer::compareTo);
  14. if(max2.isPresent()){
  15. System.out.println(max2);
  16. }

  17. /**
  18. * 获取集合中的最小值
  19. */
  20. //方法一
  21. Optional<Integer> min1 = integers.stream().reduce(Integer::min);
  22. if(min1.isPresent()){
  23. System.out.println(min1);
  24. }

  25. //方法二
  26. Optional<Integer> min2 = integers.stream().min(Integer::compareTo);
  27. if(min2.isPresent()){
  28. System.out.println(min2);
  29. }
  30. }
  31. } 

7、收集器

通过使用收集器,可以让代码更加方便的进行简化与重用。其内部主要核心是通过Collectors完成更加复杂的计算 转换,从而获取到终结果。并且Collectors内部提供了非常多的常用静态方法,直接拿来就可以了。比方说: toList。

  1. import jdk.nashorn.internal.ir.IfNode;
  2.  
  3. import java.util.*;
  4. import java.util.stream.Collectors;
  5. import java.util.stream.Stream;
  6.  
  7. /**
  8. * @author rx
  9. * @date 2022/6/1 17:18
  10. */
  11. public class StreamDemo13 {
  12. public static void main(String[] args) {
  13. List<Student> students = new ArrayList<>();
  14. students.add(new Student("wang2", 5, "f"));
  15. students.add(new Student("zh3", 3, "f"));
  16. students.add(new Student("yx", 88, "f"));
  17. //计算个数,方法一
  18. Long collect = students.stream().collect(Collectors.counting());
  19. System.out.println(collect);
  20. //计算个数,方法二
  21. long count = students.stream().count();
  22. System.out.println(count);
  23. //通过maxBy求最大值,方法一
  24. Optional<Student> optional1 = students.stream().collect(Collectors.maxBy(Comparator.comparing(student -> student.getAge())));
  25. if (optional1.isPresent()) {
  26. System.out.println(optional1);
  27. }
  28. //通过maxBy求最大值,方法二
  29. Optional<Student> max = students.stream().max(Comparator.comparing(Student::getAge));
  30. if (max.isPresent()) {
  31. System.out.println(max);
  32. }
  33. //通过summingInt()进行数据汇总
  34. Integer collect1 = students.stream().collect(Collectors.summingInt(Student::getAge));
  35. System.out.println(collect1);
  36. //通过averagingInt()获取平均值
  37. Double collect3 = students.stream().collect(Collectors.averagingInt(student -> student.getAge()));
  38. System.out.println(collect3);
  39. //通过joining方法进行数据拼接
  40. String collect2 = students.stream().map(Student::getName).collect(Collectors.joining());
  41. System.out.println(collect2);
  42. //复杂结果的返回
  43. IntSummaryStatistics collect4 = students.stream().collect(Collectors.summarizingInt(Student::getAge));
  44. collect4.getSum();
  45. collect4.getMax();
  46. collect4.getCount();
  47. collect4.getAverage();
  48. collect4.getMin();
  49. }
  50. }

8、分组

 

在数据库操作中,经常会通过group by对查询结果进行分组。同时在日常开发中,也经常会涉及到这一类操作, 如通过性别对学生集合进行分组。如果通过普通编码的方式需要编写大量代码且可读性不好。

对于这个问题的解决,java8也提供了简化书写的方式。通过 Collectors。groupingBy()即可。

  1. public class StreamDemo14 {
  2. public static void main(String[] args) {
  3. List<Student> students = new ArrayList<>();
  4. students.add(new Student("wang2", 5, "m"));
  5. students.add(new Student("zh3", 3, "f"));
  6. students.add(new Student("yx", 88, "m"));
  7. students.add(new Student("sd", 88, "f"));
  8. students.add(new Student("cd", 88, "m"));
  9. Map<String, List<Student>> collect = students.stream().collect(Collectors.groupingBy(Student::getGender));
  10. System.out.println(collect);
  11. //结果: {f=[Student{name='zh3', age=3, gender='f'}, Student{name='sd', age=88, gender='f'}], m=[Student{name='wang2', age=5, gender='m'}, Student{name='yx', age=88, gender='m'}, Student{name='cd', age=88, gender='m'}]}
  12. }
  13. }

  8.1多级分组

  1. public class StreamDemo15 {
  2. public static void main(String[] args) {
  3. List<Student> students = new ArrayList<>();
  4. students.add(new Student("wang2", 5, "m"));
  5. students.add(new Student("zh3", 3, "f"));
  6. students.add(new Student("yx", 88, "m"));
  7. students.add(new Student("sd", 88, "f"));
  8. students.add(new Student("cd", 88, "m"));
  9. Map<String, Map<String, List<Student>>> collect = students.stream().collect(Collectors.groupingBy(Student::getGender, Collectors.groupingBy(Student::getGender)));
  10. System.out.println(collect);
  11. //结果:{f={f=[Student{name='zh3', age=3, gender='f'}, Student{name='sd', age=88, gender='f'}]}, m={m=[Student{name='wang2', age=5, gender='m'}, Student{name='yx', age=88, gender='m'}, Student{name='cd', age=88, gender='m'}]}}
  12. }
  13. }

  

Java8中Stream()流的用法总结的更多相关文章

  1. Java8中Stream 的一些用法

    数据结构和数据准备 @Data @AllArgsConstructor @NoArgsConstructor static class StreamItem { Integer id; String ...

  2. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  3. Java8函数之旅 (二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  4. JDK 8 中Stream流中的去重的方法

    JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...

  5. 【JDK8】JDK 8 中Stream流中的去重的方法

    JDK 8 中Stream流中去重的方法 1.简单的去重,可以使用distinct()方法去重,该方法是通过比较equals和hashcode值去去重, 2.复杂的去重, 例如,在一个JavaBean ...

  6. Java8的Stream流(一) --- 基础用法

    Java8中的Stream Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象. Stream的特性及优点: 无存储. Stream不是一种数据 ...

  7. Java8中的流操作-基本使用&性能测试

    为获得更好的阅读体验,请访问原文:传送门 一.流(Stream)简介 流是 Java8 中 API 的新成员,它允许你以声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).这有点儿 ...

  8. JAVA8之 Stream 流(四)

    如果说前面几章是函数式编程的方法论,那么 Stream 流就应该是 JAVA8 为我们提供的最佳实践. Stream 流的定义 Stream 是支持串行和并行操作的一系列元素.流操作会被组合到流管道中 ...

  9. java8之Stream流处理

    简介 Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 OutputStream 是完全不同的概念. Stream 机制是针对集合迭代器 ...

  10. Java中stream的详细用法

    来自于:Java 8 stream的详细用法_旅行者-CSDN博客_java stream 一.概述 Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行 ...

随机推荐

  1. tomcat的安装以及环境配置

    1.Tomcat的下载地址:http://tomcat.apache.org/ Tomcat是开放源代码的WEB服务器,安装时,只需解压压缩包即可 2.环境变量的配置 1>新建系统变量CATAL ...

  2. python import导入失败 相对路径 绝对路径

    首先我们有这样一个目录结构 经过我无数次的调试,我发现从test3调用spider以及downloadss文件可以直接import调用 但是从外部的app.py文件调用,spider.py文件死活调用 ...

  3. Jmeter完整全套接口流程

    根据实际项目,编写一套完整的接口流程 项目流程介绍: 借款流程需要调用的接口,依次为: 前置校验:主要通过手机号验证该用户是存量用户,若撞库,则不允许继续操作: 用户注册:通过手机号+身份证号进行注册 ...

  4. 实验: spring-boot 整合 fluent-mybatis 实验过程!!!!

    1.参考: 简单整合,会报错误 https://segmentfault.com/a/1190000040467885?utm_source=sf-similar-article 利用maven编译, ...

  5. 3Com-OfficeConnect-Wireless-11宽带路由器默认口令

    网络空间资产搜索: app="3Com-OfficeConnect-Wireless-11g-Cable/DSL-Router" 找到环境 账户密码 admin/a***n End ...

  6. mysqld 打开连接卡

    把client的ip写在mysql服务器的/etc/hosts文件里 echo [ip] [hostname] >>/etc/hosts

  7. Tesstwo9.1.0配置步骤

    一,配置步骤 环境:Tesstwo9.1.0+Android10(华为)+Android11(模拟器) 1.查看tess-two的最新版本(GitHub - rmtheis/tess-two: For ...

  8. C++ PTA 本题要求实现一个计算m和n之间所有整数的和

    6-2  2020mhb_函数_求和 (10分) 本题要求实现一个计算m和n之间所有整数的和(求和时需要将m和n也加入到和中)的函数.注意:如果m<=n则计算m到n的所有整数之和,如果m> ...

  9. 关于IllegalMonitorStateException异常的解释之一

    注意 在同步控制方法或同步控制块里调用wait(),notify()和notifyAll().如果在非同步控制方法里调用这些方法,程序能通过编译,但运行的时候,将得到IllegalMonitorSta ...

  10. 说一说webpack的配置文件

    可能有一些友友会奇怪为什么在写webpack的配置文件的时候,我们只能用commonJS导出. 原因:在打包的时候需要运行webpack的配置文件里面的代码,而webpack在打包运行的环境在node ...