Java8 Stream用法详解

1.概述

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

  • stream() − 为集合创建串行流
  • parallelStream() - 为集合创建并行流
  • 中间操作主要有以下方法(此类型方法返回的都是 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;    }

}

1.1.filter(筛选)

    /**     * 利用Stream筛选处符合条件的集合     * @param student     * @return     */    private static List<Student> testFilter() {        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<Student> student=new ArrayList<Student>();        student.add(s1);        student.add(s2);        student.add(s3);        student.add(s4);        //筛选年龄大于15的学生        return student.stream().filter(s->s.getAge()>15).collect(Collectors.toList());//筛选居住在在浙江的学生//        return student.stream().filter(s->"浙江".equals(s.getAddress())).collect(Collectors.toList());    }

1.2.map(转换)

/**     * 集合转换     * @param student     */    private static void testMap(List<Student> student) {        //在地址前面加上部分信息,只获取地址输出        List<String> address=student.stream().map(s->"地址是:"+s.getAddress()).collect(Collectors.toList());        address.forEach(a->System.out.println(a));    }

1.3.distinct(去重)

/**     * 去重(基本类型)     * @param student     */    private static void testDistinct1() {        List<String> list=Arrays.asList("111","222","111","333","444","222");        list.stream().distinct().forEach(s->System.out.println(s));;//        list.forEach(s->System.out.println(s));     }/**     * 去重(引用对象)     * 可以看出,两个重复的 “肖战” 同学进行了去重,     * 这不仅因为使用了 distinct()方法,     * 而且因为 Student 对象重写了 equals 和      * hashCode()方法, 否则去重是无效的     */    private static void testDistinct2() {        Student s1=new Student(1L,"肖战",15,"浙江");            Student s7=new Student(1L,"肖战",15,"浙江");            Student s2=new Student(2L,"王一博",15,"湖北");           Student s3=new Student(3L,"样子",17,"北京");            Student s4=new Student(4L,"李贤",18,"浙江");            Student s8=new Student(4L,"李贤",18,"浙江");            Student s5=new Student(2L,"李一鸣",16,"广州");           Student s6=new Student(1L,"张锋",13,"湛江");    

        List<Student> student=new ArrayList<Student>();        student.add(s1);        student.add(s7);        student.add(s8);        student.add(s2);        student.add(s3);        student.add(s4);        student.add(s5);        student.add(s6);

        student.stream().distinct().forEach(s->System.out.println(s));    }

1.4.sorted(去重)

/**     * 排序(默认排序)     */    private static void testSorted() {        List<String> list=Arrays.asList("111","333","222");        list.stream().sorted().forEach(s->System.out.println(s));    }

/**     * 集合排序(指定规则)     */    private static void testSorted2() {        Student s1=new Student(1L,"肖战",15,"浙江");            Student s7=new Student(1L,"肖战",15,"浙江");            Student s2=new Student(2L,"王一博",15,"湖北");           Student s3=new Student(3L,"样子",17,"北京");            Student s4=new Student(4L,"李贤",18,"浙江");            Student s8=new Student(4L,"李贤",18,"浙江");            Student s5=new Student(2L,"李一鸣",16,"广州");           Student s6=new Student(1L,"张锋",13,"湛江");    

        List<Student> student=new ArrayList<Student>();        student.add(s1);        student.add(s7);        student.add(s8);        student.add(s2);        student.add(s3);        student.add(s4);        student.add(s5);        student.add(s6);

        //指定排序规则,先按照学生的 id 进行降序排序,再按照年龄进行降序排序        student.stream()               .sorted((stu1,stu2)->Long.compare(stu2.getId(),stu1.getId()))   //按照id进行倒叙排序               .sorted((stu1,stu2)->Integer.compare(stu2.getAge(),stu1.getAge()))  //按照年龄进行倒叙排序               .forEach(s->System.out.println(s));    }

1.5.limit(限制返回的个数)

/**     * 限制返回的个数     * 集合limit,返回前几个元素     */    private static void testlimit() {        List<String> list=Arrays.asList("111","222","333");        List<String> list2=list.stream().limit(2).collect(Collectors.toList());        list2.forEach(s->System.out.println(s));    }

1.6.skip(删除前几个元素)

/**     * 集合skip,删除前n个元素     */    private static void testSkip() {        List<String> list=Arrays.asList("333","222","111");        List<String> collect = list.stream().skip(2).collect(Collectors.toList());        collect.forEach(s->System.out.println(s));    }

1.7.reduce(将集合中的每一个元素聚合成一条数据)

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

1.8.min(求集合中的最小值)

/**     * 求min集合中元素的最小值     * 求所有学生中年龄最小的一个,max 同理,求最大值。     */    private static void testMin() {        Student s1=new Student(1L,"肖战",15,"浙江");            Student s7=new Student(1L,"肖战",15,"浙江");            Student s2=new Student(2L,"王一博",15,"湖北");           Student s3=new Student(3L,"样子",17,"北京");            Student s4=new Student(4L,"李贤",18,"浙江");            Student s8=new Student(4L,"李贤",18,"浙江");            Student s5=new Student(2L,"李一鸣",16,"广州");           Student s6=new Student(1L,"张锋",13,"湛江");    

        List<Student> student=new ArrayList<Student>();        student.add(s1);        student.add(s7);        student.add(s8);        student.add(s2);        student.add(s3);        student.add(s4);        student.add(s5);        student.add(s6);        //求年龄最小的人        Student student2 = student.stream().min((stu1,stu2)->Integer.compare(stu1.getAge(),stu2.getAge())).get();        System.out.println(student2);    }

1.8.anyMatch/allMatch/noneMatch(匹配)

/**     * 测试匹配     *anyMatch/allMatch/noneMatch(匹配)     *anyMatch:Stream 中任意一个元素符合传入的 predicate,返回 true      allMatch:Stream 中全部元素符合传入的 predicate,返回 true      noneMatch:Stream 中没有一个元素符合传入的 predicate,返回 true     */    private static void testMatch() {        Student s1=new Student(1L,"肖战",15,"浙江");            Student s7=new Student(1L,"肖战",15,"浙江");            Student s2=new Student(2L,"王一博",15,"湖北");           Student s3=new Student(3L,"样子",17,"北京");            Student s4=new Student(4L,"李贤",18,"浙江");            Student s8=new Student(4L,"李贤",18,"浙江");            Student s5=new Student(2L,"李一鸣",16,"广州");           Student s6=new Student(1L,"张锋",13,"湛江");    

        List<Student> student=new ArrayList<Student>();        student.add(s1);        student.add(s7);        student.add(s8);        student.add(s2);        student.add(s3);        student.add(s4);        student.add(s5);        student.add(s6);

        boolean anyMatch = student.stream().anyMatch(s->"湖北".equals(s.getAddress()));        if (anyMatch) {            System.out.println("有湖北人");        }

        boolean allMatch = student.stream().allMatch(s->s.getAge()>=15);        if (allMatch) {            System.out.println("所有学生都满15周岁");        }

        boolean noneMatch = student.stream().noneMatch(s->"杨洋".equals(s.getName()));        if (noneMatch) {            System.out.println("没有叫杨洋的人");        }    }

更多资源和教程请关注公众号:非科班的科班。
如果觉得我写的还可以请给个赞,谢谢大家,你的鼓励是我创作的动力

原文地址:https://www.cnblogs.com/liduchang/p/11779009.html

时间: 2024-10-08 11:36:59

Java8 Stream用法详解的相关文章

Node.js开发入门—Stream用法详解

Stream是Node.js中非常重要的一个模块,应用广泛.一个流是一个具备了可读.可写或既可读又可写能力的接口,通过这些接口,我们可以和磁盘文件.套接字.HTTP请求来交互,实现数据从一个地方流动到另一个地方的功能. 所有的流都实现了EventEmitter的接口,具备事件能力,通过发射事件来反馈流的状态.比如有错误发生时会发射"error"事件,有数据可被读取时发射"data"事件.这样我们就可以注册监听器来处理某个事件,达到我们的目的. Node.js定义了R

【转】Java8 Stream 流详解

  当我第一次阅读 Java8 中的 Stream API 时,说实话,我非常困惑,因为它的名字听起来与 Java I0 框架中的 InputStream 和 OutputStream 非常类似.但是实际上,它们完全是不同的东西. Java8 Stream 使用的是函数式编程模式,如同它的名字一样,它可以被用来对集合进行链状流式的操作. 本文就将带着你如何使用 Java 8 不同类型的 Stream 操作.同时您还将了解流的处理顺序,以及不同顺序的流操作是如何影响运行时性能的. 我们还将学习终端

Java8初体验(二)Stream语法详解

原文链接:http://ifeve.com/stream/ 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequential and parallel aggregate operations. 我们来解读一下上面的那句话: Stream是元素的集合,这点让Stream看起来用些类似Iterator: 可以支持顺序和并行的对原Stream进行汇聚的操作: 大家可以把Stream当成一个高级版本的

【转】Java8初体验(二)Stream语法详解

原文链接 http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 [email protected]上篇文章Java8初体验(一)lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Str

2020了你还不会Java8新特性?(五)收集器比较器用法详解及源码剖析

收集器用法详解与多级分组和分区 为什么在collectors类中定义一个静态内部类? static class CollectorImpl<T, A, R> implements Collector<T, A, R> 设计上,本身就是一个辅助类,是一个工厂.作用是给开发者提供常见的收集器实现.提供的方法都是静态方法,可以直接调用. 函数式编程最大的特点:表示做什么,而不是如何做.开发者更注重如做什么,底层实现如何做. /** * Implementations of {@link

C++ string 用法详解

/////////////////////////////////////////////////////////////////////////////////// 任何人对本文进行引用都要标明作者是Nicolai M.Josuttis /////////////////////////////////////////////////////////////////////////////////// C++ 语言是个十分优秀的语言,但优秀并不表示完美.还是有许多人不愿意使用C或者C++,为什

Java语言Socket接口用法详解

Socket接口用法详解   在Java中,基于TCP协议实现网络通信的类有两个,在客户端的Socket类和在服务器端的ServerSocket类,ServerSocket类的功能是建立一个Server,并通过accept()方法随时监听客户端的连接请求. 扩展: ServerSocket中常用的构造函数及方法 构造函数:ServerSocket(int port) 这是一个构造方法,用于在当前的服务器默认的IP地址上监听一个指定的端口,即在指定的IP和端口创建一个ServerSocket对象

FileUpload上传控件用法详解 (转载)

FileUpload 类显示一个文本框控件和一个浏览按钮,使用户可以选择客户端上的文件并将它上载到 Web 服务器.用户通过在控件的文本框中输入本地计算机上文件的完整路径(例如,C:\MyFiles\TestFile.txt )来指定要上载的文件.用户也可以通过单击“浏览” 按钮,然后在“选择文件” 对话框中定位文件来选择文件. 注意: FileUpload 控件设计为仅用于部分页面呈现期间的回发情况,并不用于异步回发情况.在 UpdatePanel 控件内部使用 FileUpload 控件时,

Java8 Lambda表达式详解手册及实例

先贩卖一下焦虑,Java8发于2014年3月18日,距离现在已经快6年了,如果你对Java8的新特性还没有应用,甚至还一无所知,那你真得关注公众号"程序新视界",好好系列的学习一下Java8的新特性.Lambda表达式已经在新框架中普通使用了,如果你对Lambda还一无所知,真得认真学习一下本篇文章了. 现在进入正题Java8的Lambda,首先看一下发音 ([?l?md?])表达式.注意该词的发音,b是不发音的,da发[d?]音. 为什么要引入Lambda表达式 简单的来说,引入La