千家信息网

Java8中Stream的常用方法有哪些

发表于:2025-01-19 作者:千家信息网编辑
千家信息网最后更新 2025年01月19日,本文小编为大家详细介绍"Java8中Stream的常用方法有哪些",内容详细,步骤清晰,细节处理妥当,希望这篇"Java8中Stream的常用方法有哪些"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢
千家信息网最后更新 2025年01月19日Java8中Stream的常用方法有哪些

本文小编为大家详细介绍"Java8中Stream的常用方法有哪些",内容详细,步骤清晰,细节处理妥当,希望这篇"Java8中Stream的常用方法有哪些"文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

简介

java8也出来好久了,接口默认方法,lambda表达式,函数式接口,Date API等特性还是有必要去了解一下。比如在项目中经常用到集合,遍历集合可以试下lambda表达式,经常还要对集合进行过滤和排序,Stream就派上用场了。用习惯了,不得不说真的很好用。

Stream作为java8的新特性,基于lambda表达式,是对集合对象功能的增强,它专注于对集合对象进行各种高效、便利的聚合操作或者大批量的数据操作,提高了编程效率和代码可读性。

Stream的原理:将要处理的元素看做一种流,流在管道中传输,并且可以在管道的节点上处理,包括过滤筛选、去重、排序、聚合等。元素流在管道中经过中间操作的处理,最后由最终操作得到前面处理的结果。

集合有两种方式生成流:

  • stream() − 为集合创建串行流

  • parallelStream() - 为集合创建并行流

上图中是Stream类的类结构图,里面包含了大部分的中间和终止操作。

中间操作主要有以下方法(此类型方法返回的都是Stream):map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered

终止操作主要有以下方法:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator

举例说明

首先为了说明Stream对对象集合的操作,新建一个Student类(学生类),覆写了equals()和hashCode()方法

public class Student {      private Long id;      private String name;      private int age;      private String address;      public Student() {}      public Student(Long id, String name, int age, String address) {         this.id = id;         this.name = name;         this.age = age;         this.address = address;     }      @Override     public String toString() {         return "Student{" +                 "id=" + id +                 ", name='" + name + '\'' +                 ", age=" + age +                 ", address='" + address + '\'' +                 '}';     }      @Override     public boolean equals(Object o) {         if (this == o) return true;         if (o == null || getClass() != o.getClass()) return false;         Student student = (Student) o;         return age == student.age &&                 Objects.equals(id, student.id) &&                 Objects.equals(name, student.name) &&                 Objects.equals(address, student.address);     }      @Override     public int hashCode() {         return Objects.hash(id, name, age, address);     }      public Long getId() {         return id;     }      public void setId(Long id) {         this.id = id;     }      public String getName() {         return name;     }      public void setName(String name) {         this.name = name;     }      public int getAge() {         return age;     }      public void setAge(int age) {         this.age = age;     }      public String getAddress() {         return address;     }      public void setAddress(String address) {         this.address = address;     }  }

filter(筛选)

public static void main(String [] args) {          Student s1 = new Student(1L, "肖战", 15, "浙江");         Student s2 = new Student(2L, "王一博", 15, "湖北");         Student s3 = new Student(3L, "杨紫", 17, "北京");         Student s4 = new Student(4L, "李现", 17, "浙江");         List students = new ArrayList<>();         students.add(s1);         students.add(s2);         students.add(s3);         students.add(s4);          List streamStudents = testFilter(students);         streamStudents.forEach(System.out::println);     }     /**      * 集合的筛选      * @param students      * @return      */     private static List testFilter(List students) {         //筛选年龄大于15岁的学生 //        return students.stream().filter(s -> s.getAge()>15).collect(Collectors.toList());         //筛选住在浙江省的学生         return students.stream().filter(s ->"浙江".equals(s.getAddress())).collect(Collectors.toList());     }

运行结果:

这里我们创建了四个学生,经过filter的筛选,筛选出地址是浙江的学生集合。

map(转换)

public static void main(String [] args) {         Student s1 = new Student(1L, "肖战", 15, "浙江");        Student s2 = new Student(2L, "王一博", 15, "湖北");        Student s3 = new Student(3L, "杨紫", 17, "北京");        Student s4 = new Student(4L, "李现", 17, "浙江");        List students = new ArrayList<>();        students.add(s1);        students.add(s2);        students.add(s3);        students.add(s4);         testMap(students);    }     /**     * 集合转换     * @param students     * @return     */    private static void testMap(List students) {        //在地址前面加上部分信息,只获取地址输出        List addresses = students.stream().map(s ->"住址:"+s.getAddress()).collect(Collectors.toList());        addresses.forEach(a ->System.out.println(a));    }

运行结果

map就是将对应的元素按照给定的方法进行转换。

distinct(去重)

public static void main(String [] args) {       testDistinct1();    }     /**     * 集合去重(基本类型)     */    private static void testDistinct1() {        //简单字符串的去重        List list = Arrays.asList("111","222","333","111","222");        list.stream().distinct().forEach(System.out::println);    }

运行结果:

public static void main(String [] args) {        testDistinct2();     }      /**      * 集合去重(引用对象)      */     private static void testDistinct2() {         //引用对象的去重,引用对象要实现hashCode和equal方法,否则去重无效         Student s1 = new Student(1L, "肖战", 15, "浙江");         Student s2 = new Student(2L, "王一博", 15, "湖北");         Student s3 = new Student(3L, "杨紫", 17, "北京");         Student s4 = new Student(4L, "李现", 17, "浙江");         Student s5 = new Student(1L, "肖战", 15, "浙江");         List students = new ArrayList<>();         students.add(s1);         students.add(s2);         students.add(s3);         students.add(s4);         students.add(s5);         students.stream().distinct().forEach(System.out::println);     }

运行结果:

可以看出,两个重复的"肖战"同学进行了去重,这不仅因为使用了distinct()方法,而且因为Student对象重写了equals和hashCode()方法,否则去重是无效的。

sorted(排序)

public static void main(String [] args) {        testSort1();   }    /**    * 集合排序(默认排序)    */   private static void testSort1() {       List list = Arrays.asList("333","222","111");       list.stream().sorted().forEach(System.out::println);   }

运行结果:

public static void main(String [] args) {      testSort2(); }  /**  * 集合排序(指定排序规则)  */ private static void testSort2() {     Student s1 = new Student(1L, "肖战", 15, "浙江");     Student s2 = new Student(2L, "王一博", 15, "湖北");     Student s3 = new Student(3L, "杨紫", 17, "北京");     Student s4 = new Student(4L, "李现", 17, "浙江");     List students = new ArrayList<>();     students.add(s1);     students.add(s2);     students.add(s3);     students.add(s4);     students.stream()             .sorted((stu1,stu2) ->Long.compare(stu2.getId(), stu1.getId()))             .sorted((stu1,stu2) -> Integer.compare(stu2.getAge(),stu1.getAge()))             .forEach(System.out::println); }

运行结果:

上面指定排序规则,先按照学生的id进行降序排序,再按照年龄进行降序排序

limit(限制返回个数)

public static void main(String [] args) {         testLimit();    }     /**     * 集合limit,返回前几个元素     */    private static void testLimit() {        List list = Arrays.asList("333","222","111");        list.stream().limit(2).forEach(System.out::println);    }

运行结果:

skip(删除元素)

public static void main(String [] args) {         testSkip();    }     /**     * 集合skip,删除前n个元素     */    private static void testSkip() {        List list = Arrays.asList("333","222","111");        list.stream().skip(2).forEach(System.out::println);    }

运行结果:

reduce(聚合)

public static void main(String [] args) {         testReduce();     }     /**      * 集合reduce,将集合中每个元素聚合成一条数据      */     private static void testReduce() {         List list = Arrays.asList("欢","迎","你");         String appendStr = list.stream().reduce("北京",(a,b) -> a+b);         System.out.println(appendStr);     }

运行结果:

min(求最小值)

public static void main(String [] args) {       testMin();   }    /**    * 求集合中元素的最小值    */   private static void testMin() {       Student s1 = new Student(1L, "肖战", 14, "浙江");       Student s2 = new Student(2L, "王一博", 15, "湖北");       Student s3 = new Student(3L, "杨紫", 17, "北京");       Student s4 = new Student(4L, "李现", 17, "浙江");       List students = new ArrayList<>();       students.add(s1);       students.add(s2);       students.add(s3);       students.add(s4);       Student minS = students.stream().min((stu1,stu2) ->Integer.compare(stu1.getAge(),stu2.getAge())).get();       System.out.println(minS.toString());   }

运行结果:

上面是求所有学生中年龄最小的一个,max同理,求最大值。

anyMatch/allMatch/noneMatch(匹配)

public static void main(String [] args) {        testMatch();    }     private static void testMatch() {        Student s1 = new Student(1L, "肖战", 15, "浙江");        Student s2 = new Student(2L, "王一博", 15, "湖北");        Student s3 = new Student(3L, "杨紫", 17, "北京");        Student s4 = new Student(4L, "李现", 17, "浙江");        List students = new ArrayList<>();        students.add(s1);        students.add(s2);        students.add(s3);        students.add(s4);        Boolean anyMatch = students.stream().anyMatch(s ->"湖北".equals(s.getAddress()));        if (anyMatch) {            System.out.println("有湖北人");        }        Boolean allMatch = students.stream().allMatch(s -> s.getAge()>=15);        if (allMatch) {            System.out.println("所有学生都满15周岁");        }        Boolean noneMatch = students.stream().noneMatch(s -> "杨洋".equals(s.getName()));        if (noneMatch) {            System.out.println("没有叫杨洋的同学");        }    }

运行结果:

anyMatch:Stream 中任意一个元素符合传入的 predicate,返回 true

allMatch:Stream 中全部元素符合传入的 predicate,返回 true

noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true

读到这里,这篇"Java8中Stream的常用方法有哪些"文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注行业资讯频道。

浙江 方法 结果 元素 运行 排序 湖北 学生 对象 北京 杨紫 处理 常用 最小 地址 年龄 文章 管道 表达式 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 雅邦网络技术发展公司是做什么的 杭州水电缴费软件开发团队 黑龙江服务器电源采购 流浪武士服务器要强化吗 服务器列表无法获取 洛阳巨人网络安全教育 sql数据库截图员工管理 东莞佳懿网络技术有限公司怎么样 网络技术与应用田怡课后答案 速达软件数据库密码 网络安全手抄报设计说明 苏州戴尔服务器品牌 公检法 软件开发 涉密 三国志战略版陕西服务器 数据库锁是什么意思 三明学院网络服务器 通行数据库 数据库字段显示月日年怎么设置 江苏hpe塔式服务器哪家好 帝国cms 审核 数据库 乌班图软件开发版本 10大网络安全观点 应用联网控制软件开发 如何提升数据库的优化能力 金山区智能化软件开发定制报价表 软件开发前端和后端是什么 物流软件开发前景 万方专利数据库哪种专利收录最多 缓存服务器 设计方案 我的世界服务器网易版预告
0