Java的Stream流来了解一下

目录
  • Stream流
    • 1、什么是Stream流:
    • 2、创建流:
    • 3、Stream的map映射流
    • 4、Stream查找与匹配
  • 总结

Stream流

上篇文章讲了Java 8 的一个新特性:Lambda表达式,在业务中若能熟练的使用,可以节省很多代码量,看着也整洁很多。那么这篇文章将介绍另一个新特性:Stream流,不要看错哈!!!不是打游戏的steam!!

1、什么是Stream流:

Stream 是Java 8 提出的一个新概念,不是输入输出的 Stream 流 (和IO流其实没有任何关系哈),而是一种使用函数式编程方式在集合类上进行操作的工具。简而言之,是以内部迭代的方式处理集合数据的操作,内部迭代可以将更多的控制权交给集合类。Stream 和 Iterator 的功能类似,只是Iterator 是以外部迭代的形式处理集合数据的操作。

当然Stream也有自己特性:

1.不是一种数据结构,不会存数据,只是在原数据集上定义了一组操作

2.这些操作是惰性的,即每当访问到流中的一个元素,才会在此元素上执行这一系列操作

3.因为不保存数据,故每个Stream流只能使用一次。

Stream流的实现图:

2、创建流:

想要用Stream流来操作集合,那么就需要将数组或者集合先转换成Stream流才可以操作

Stream的官方文档:

https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html

先来看四个方法:

1.filter:通过lambda表达式来实现条件过滤

2.limit:截取流,截取一段流

3.skip:跳过流

4.distinct:去除重复

创建Stream:

public class Test {
    public static void main(String[] args) {
        String [] arr = {"东","南","西","北"};
        //将数组转换成Stream
        Stream<String> stream = Arrays.stream(arr);
        stream = Stream.of(arr);
        stream = Stream.of("东","南","西","北");
        //将list集合转换成stream
        List<String> list = Arrays.asList("aa","cc","bb","aa","dd");
        stream = list.stream();
        //排序、去重、遍历
        list.stream().sorted().distinct().forEach(System.out::println);
        //用过Stream流操作完集合后还可以再转换成一个新的集合
        List<String> newList = list.stream().sorted().distinct().collect(Collectors.toList());
        System.out.println(newList.toString());
    }
}

输出:

//遍历并去重后的结果:
aa
bb
cc
dd
//用过Stream流操作完集合后还可以再转换成一个新的集合
[aa, bb, cc, dd]

四个方法的操作:Person类:

这个类代码比较多,所有不把get/set方法写进去了,大家的使用的时候别忘!!

public class Person {
    private String  name;
    private Integer age;
    private  String country;
    private  char sex;
    @Override
    public String toString() {
        return "信息表:{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", country='" + country + '\'' +
                ", sex=" + sex +
                '}';
    }
//这里节省的get/set代码
//重写toString() 和 equals 和 hashcode 方法
    @Override
    public boolean equals(Object o){
        if(this == o)
            return true;
        if(o == null || getClass() != o.getClass())
            return false;
        Person person = (Person) o;
        if(country != null){
            if(this.country.equals(person.country)){
                return  true;
            }else{
                return false;
            }
        }
        return false;
    }
    @Override
    public int hashCode(){
        return Objects.hash(country);
    }
}

测试类:

结合了lambda表达式来写

public class Test {
    public static void main(String[] args) {
        List<Person> perosnList = new ArrayList<>();
        perosnList.add(new Person("王一", 30, "中国", 'M'));
        perosnList.add(new Person("张三", 19, "美国", 'F'));
        perosnList.add(new Person("李四", 29, "日本", 'F'));
        perosnList.add(new Person("小美", 74, "英国", 'M'));
        perosnList.add(new Person("熊二", 15, "意大利", 'F'));
        perosnList.add(new Person("熊大", 66, "韩国", 'F'));
        //返回年龄大于20岁的学生集合
        System.out.println("返回年龄大于20岁的学生集合");
        perosnList.stream().filter(p -> p.getAge() > 20).forEach(System.out::println);
        //返回年龄大于50岁的学生集合
        System.out.println("返回年龄大于50岁的集合");
        List<Person> list = perosnList.stream().filter(p -> p.getAge() > 50).collect(Collectors.toList());
        System.out.println(list);
        //返回年龄大于20岁的中国学生
        System.out.println("返回年龄大于20岁的中国人");
        perosnList.stream().filter(p -> p.getAge() > 20).filter(p -> p.getCountry().equals("韩国")).forEach(System.out::println);
        //年龄大于20  中国  性别M
        System.out.println("返回年龄大于20  中国  性别M");
        perosnList.stream().filter(p -> p.getAge() > 20 && p.getCountry().equals("中国") && p.getSex() == 'M').forEach(System.out::println);
    }
}

看看结果:

返回年龄大于20岁的学生集合
信息表:{name='王一', age=30, country='中国', sex=M}
信息表:{name='李四', age=29, country='日本', sex=F}
信息表:{name='小美', age=74, country='英国', sex=M}
信息表:{name='熊大', age=66, country='韩国', sex=F}
返回年龄大于50岁的集合
[信息表:{name='小美', age=74, country='英国', sex=M}, 信息表:{name='熊大', age=66, country='韩国', sex=F}]
返回年龄大于20岁的中国人
信息表:{name='熊大', age=66, country='韩国', sex=F}
返回年龄大于20  中国  性别M
信息表:{name='王一', age=30, country='中国', sex=M}

小结:

使用Stream流可以容易操作数组或者集合,可以结合Lambda表达式,可以让一句表达式整洁明了,其实既然是Java退出的新特性,那么肯定是有用处的。

3、Stream的map映射流

public class Test {
    public static void main(String[] args) {
        //map的作用是迭代取到每个list元素,再通过map里面的函数进行相应的操作
        List<String> list1 = Arrays.asList("a","bb","ccc","dddd");
        //通过map取到每个集合元素的长度并返回
        Stream<Integer> stream = list1.stream().map(p->p.length());
        stream.forEach(System.out::println);
        System.out.println("----------------");
        List<String> userList = new ArrayList<>();
        userList.add("周杰伦.tom");
        userList.add("尼古拉斯.赵四");
        userList.add("牛顿.巴基斯");
        userList.add("赵少华.思密达");
        List<String> uList = userList.stream().map(p->p.substring(p.indexOf(".")+1,
                p.length())).collect(Collectors.toList());
        System.out.println(uList.toString());
    }
}

输出:

1
2
3
4
----------------
[tom, 赵四, 巴基斯, 思密达]

4、Stream查找与匹配

Stream内还有一个 anyMatch(Predicate predicate) 的方法:

返回此流中的任何元素是否匹配所提供的词

Demo:

public class Test {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("周杰伦","王力宏","孙燕姿","林俊杰");
        boolean flag1 = list.stream().anyMatch(ele->ele.contains("燕"));
        System.out.println("有没有名字包含燕的同学:"+flag1);
        //判断开头:
        boolean flag2 = list.stream().anyMatch(ele->ele.startsWith("王"));
        System.out.println("有没有名字开头是王的同学:"+flag2);
        //判断结尾:
        boolean flag3 = list.stream().anyMatch(ele->ele.endsWith("杰"));
        System.out.println("有没有名字结尾是杰的同学:"+flag3);
        // anyMatch是匹配所有的,要满足条件
        boolean flag4 = list.stream().anyMatch(ele->ele.length()>2);
        System.out.println("所有同学的名字都是两个字以上的吗"+flag4);
        boolean flag5 = list.stream().anyMatch(ele->ele.startsWith("王"));
        System.out.println("所有同学的名字都有王吗?"+flag5);
        //noneMatch
        boolean flag6 = list.stream().noneMatch(ele->ele.contains("燕"));
        System.out.println("集合中都没有包含'燕'这个字吗"+flag5);
    }
}

输出:

有没有名字包含燕的同学:true
有没有名字开头是王的同学:true
有没有名字结尾是杰的同学:true
所有同学的名字都是两个字以上的吗true
所有同学的名字都有王吗?true
集合中都没有包含'燕'这个字吗true

使用anyMatch()里面的方法可以很容易对这个流的信息匹配。

最后附上一张Stream流的方法速记图啦:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Java关于JDK1.8新特性的Stream流

    目录 Java 的Stream流 一.定义 二.操作的特征 三.代码示例 1.生成流 2.forEach 迭代 3.limit方法用于获取指定数量的流 4.map 5.sorted 6.并行(parallel)程序 7.Collectors 8.转化(将枚举类转成map) Java 的Stream流 一.定义 JDK1.8 中增加了Stream流,Stream流是一个来自数据源的元素队列并支持聚合操作.元素是特定类型的对象,形成一个队列,Java中的Stream并不会存储元素,而是按需计算数据源

  • Java 8 Stream流强大的原理

    目录 1.Stream的组成与特点 2.BaseStream接口 3.Stream接口 4.关闭流操作 5.并行流和串行流 6.ParallelStream背后的男人:ForkJoinPool 7.用ForkJoinPool的眼光来看ParallelStream 8.并行流的性能 9.NQ模型 10.遇到顺序 前言: Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象. Stream API可以极大提高Java程序员的生产力,让程

  • Java十分钟快速掌握Stream流

    1.什么是Stream流: Stream 是Java 8 提出的一个新概念,不是输入输出的 Stream 流 (和IO流其实没有任何关系哈),而是一种使用函数式编程方式在集合类上进行操作的工具.简而言之,是以内部迭代的方式处理集合数据的操作,内部迭代可以将更多的控制权交给集合类.Stream 和 Iterator 的功能类似,只是Iterator 是以外部迭代的形式处理集合数据的操作. 当然Stream也有自己特性: 不是一种数据结构,不会存数据,只是在原数据集上定义了一组操作 这些操作是惰性的

  • 一篇文章带你了解Java Stream流

    目录 一.Stream流引入 现有一个需求: 1.用常规方法解决需求 2.用Stream流操作集合,获取流,过滤操作,打印输出 二.Stream流的格式 三.获取流 四.Stream流的常用方法 方法演示: 1.count方法: 2.filter方法: 3.forEach方法 4.limit方法 5.map方法 6.skip方法 7.concat方法 五.收集Stream流 总结 一.Stream流引入 Lambda表达式,基于Lambda所带来的函数式编程,又引入了一个全新的Stream概念,

  • Java基础:流Stream详解

    目录 写在前面 一."流"概念 二.流的分类 1.按流的方向分为:输入流.输出流 2.按流处理数据的单位分为:字节流.字符流 3.按流的功能分为:节点流(又称低级流).过滤流(又称高级流.处理流.包装流) 4.字节流与字符流区别 三.流的方法 1.字节流 字节输入流类:FileInputStream.BufferedInputStream和DataInputStream 构造方法: 常用方法: 构造方法: 常用方法: 构造方法: 常用方法: 字节输出流类:FileOutputStrea

  • Java中Stream流去除List重复元素的方法

    本文实例为大家分享了Java中Stream流去除List重复元素的具体代码,供大家参考,具体内容如下 业务场景 在开发中我们常常需要过滤List中的重复对象,而重复的定义往往是根据单个条件或者多个条件,如果是单个条件的话还是比较好处理的,即使不使用工具,代码也可以很容易实现,但如果判断依据不是单个条件,而是多个条件的话,代码实现起来就会比较复杂,此时我们一般就会使用工具来简化开发 单条件去重代码 ArrayList<listData> collect = list.stream().colle

  • Java中Stream流中map和forEach的区别详解

    目录 什么是 stream 流 Map forEach 使用场景 不是很难的知识,但是今天犯错了,记录一下 什么是 stream 流 我们在使用集合或数组对元素进行操作时往往会遇到这种情况:通过对不同类型的存储元素,按照特定条件进行查找.排序.等操作时往往会写一大段代码,而且更要命的是,不同类型的数据,操作的方法也不一样,比如一个存储 Student 实体类和一个只存储 String 类型的集合俩者的操作步骤肯定大不一样且无法通用,而 stream API 就解决了这些问题,对数据操作时进行了统

  • 一文详解Java中Stream流的使用

    目录 简介 操作1:创建流 操作2:中间操作 筛选(过滤).去重 映射 排序 消费 操作3:终止操作 匹配.最值.个数 收集 规约 简介 说明 本文用实例介绍stream的使用. JDK8新增了Stream(流操作) 处理集合的数据,可执行查找.过滤和映射数据等操作. 使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询.可以使用 Stream API 来并行执行操作. 简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式. 特点 不是数据结构

  • Java集合Stream流操作的基本使用教程分享

    目录 事前准备 Filter Sorted Map Match Count Reduce 总结 Java 中可以使用 java.util.Stream 对一个集合(实现了java.util.Collection接口的类)做各种操作,例如:求和.过滤.排序等等. 这些操作可能是中间操作——返回一个 Stream 流,或者是终端操作——返回一个结果. 流操作并不会影响原来的集合,可以简单认为,流操作是把集合中的一个元素逐个复制放到一个首尾相接的流动的水槽中. Stream 流支持同步执行,也支持并发

  • 关于JAVA中stream流的基础处理(获取对象字段和对象批量处理等)

    目录 Stream流程处理情况 1:按指定字段获取集合对象中的字段: 2:按指定字段对集合对象进行排序: 3: 按指定字段对集合对象去重处理 4: 对集合对象批量处理 5: 将集合对象中指定字段转数组 Stream流程处理情况 1:按指定字段获取集合对象中的字段: List<String> idList = initUserList.stream().map(User::getId).collect(Collectors.toList()); 2:按指定字段对集合对象进行排序: List<

  • Java的Stream流来了解一下

    目录 Stream流 1.什么是Stream流: 2.创建流: 3.Stream的map映射流 4.Stream查找与匹配 总结 Stream流 上篇文章讲了Java 8 的一个新特性:Lambda表达式,在业务中若能熟练的使用,可以节省很多代码量,看着也整洁很多.那么这篇文章将介绍另一个新特性:Stream流,不要看错哈!!!不是打游戏的steam!! 1.什么是Stream流: Stream 是Java 8 提出的一个新概念,不是输入输出的 Stream 流 (和IO流其实没有任何关系哈),

  • 简单总结Java IO中stream流的使用方法

    Java语言的输入输出功能是十分强大而灵活的,对于数据的输入和输出操作以"流"(stream)的方式进行.J2SDK提供了各种各样的"流"类,用以获取不同种类的数据,定义在包java.io中.程序中通过标准的方法输入或输出数据. Java中的流可以从不同的角度进行分类: 按照流的方向不同:分为输入流和输出流. 按照处理数据单位的不同:分为字节流(8位)和字符流(16位). 按照功能不同:分为节点流和处理流. 节点流:是可以从一个特定的数据源(节点)读写数据的流(例如

  • 通过实例了解Java 8创建Stream流的5种方法

    这篇文章主要介绍了通过实例了解Java 8创建Stream流的5种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 不知不觉间,Java已经发展到13了,来不及感慨时间过得真的太快了,来不及学习日新月异的技术更新,目前大多数公司还是使用的JDK8版本,一方面是版本的稳定,另一方面是熟悉,所以很多公司都觉得不升级也挺好. 说到JDK8,真的是一个里程碑的版本,一出世就受到所有开发者的青睐,并主动花时间和精力去学习,也是我见过企业升级JDK最豪爽

随机推荐