Stream流的简单使用

简介: 这篇文章介绍了Java中Stream流的基本概念和使用方法。文章解释了Stream流的三类方法:获取流、中间方法和终结方法。详细讨论了如何生成Stream流,包括从Collection体系集合、Map体系集合、数组和同种数据类型的多个数据中生成流。接着,介绍了Stream流的中间操作方法,如`filter`、`limit`、`skip`、`concat`和`distinct`。文章还讨论了Stream流的终结方法,如`forEach`和`count`,以及收集方法,如`collect`。最后,通过几个例子演示了如何使用Stream流进行数据处理和收集操作。

stream流的三类方法

  1. 获取Stream流
    ○ 创建一条流水线,并把数据放到流水线上准备进行操作
  2. 中间方法
    ○ 流水线上的操作
    ○ 一次操作完毕之后,还可以继续进行其他操作
  3. 终结方法
    ○ 一个Stream流只能有一个终结方法
    ○ 是流水线上的最后一个操作

在这里插入图片描述

其实Stream流非常简单,只需要将其理解为一条流水线即可,然后在不同的时期去做不同的操作。

获取流-如何生成流

生成Stream流的方式:

  1. Collection体系集合
    使用默认方法stream()生成流, default Stream stream()
  2. Map体系集合
    把Map转成Set集合,间接的生成流 entrySet().stream() 或者 keySet().stream()
  3. 数组
    通过Arrays中的静态方法stream生成流 Arrays.stream(T Values)
  4. 同种数据类型的多个数据
    通过Stream接口的静态方法of(T... values)生成流

stream流的中间操作方法

中间操作的意思是,执行完此方法之后,Stream流依然可以继续执行其他操作(“每次中间操作完成后返回的仍然是stream流”

方法名 说明
Stream filter(Predicate predicate) 用于对流中的数据进行过滤
Stream limit(long maxSize) 返回此流中的元素组成的流,截取前指定参数个数的数据
Stream skip(long n) 跳过指定参数个数的数据,返回由该流的剩余元素组成的流
static Stream concat(Stream a, Stream b) 合并a和b两个流为一个流
Stream distinct() 返回由该流的不同元素(根据Object.equals(Object) )组成的流

stream流的终结方法

终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作(“即方法操作后返回的对象不再是一个stream对象”

方法名 说明
void forEach(Consumer action) 对此流的每个元素执行操作
ong count() 返回此流中的元素数

stream流的收集方法

  • 概念
    对数据使用Stream流的方式操作完毕后,可以把流中的数据收集到集合中
  • 常用方法
方法名    说明
R collect(Collector collector)    把结果收集到集合中
  • 工具类Collectors提供了具体的收集方式
方法名 说明
public static Collector toList() 把元素收集到List集合中
public static Collector toSet() 把元素收集到Set集合中
public static Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中

一些使用Stream流的例子

  1. 找出数组中的偶数并遍历输出
    List<Integer> list = new ArrayList<Integer>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(4);
    list.add(5);
    list.add(6);
    list.add(7);
    list.add(8);
    list.add(9);
    list.add(10);
    list.stream().filter(s->0 == s%2).forEach(s-> System.out.println(s));

在这里插入图片描述

  1. 根据字符串数组中的元素按照逗号,的位置将数据提取出来,并且要求年龄>24,然后将结果进行输出
List<String> list = new ArrayList<>();
        list.add("zhangsan,23");
        list.add("lisi,24");
        list.add("wangwu,25");
        Map<String, Integer> collect = list.stream()
                .filter(s -> 24 <= Integer.parseInt(s.split(",")[1]))
                .collect(Collectors.toMap(s -> s.split(",")[0], s -> Integer.parseInt(s.split(",")[1])));
        System.out.println(collect);

在这里插入图片描述

  1. 将字符串数组中数组元素的信息按照,分离出来,并且进行过滤,然后封装到对应的实体类actor

实体类(name , age):

package com.robin.mystream;

public class Actor {
   

    private String name;
    private Integer age;

    public String getName() {
   
        return name;
    }

    public void setName(String name) {
   
        this.name = name;
    }

    public Integer getAge() {
   
        return age;
    }

    public void setAge(Integer age) {
   
        this.age = age;
    }

    public Actor(String name, Integer age) {
   
        this.name = name;
        this.age = age;
    }

    public Actor() {
   
    }

    @Override
    public String toString() {
   
        return "Actor{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
package com.robin.mystream;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class StreamDemo3 {
   
    public static void main(String[] args) {
   
        List<String> list1 = new ArrayList<>();
        list1.add("张三,23");
        list1.add("李四,24");
        list1.add("王麻子,25");
        list1.add("二狗子,27");
        list1.add("狗剩,22");
        list1.add("德柱子,21");

        List<String> list2 = new ArrayList<>();
        list2.add("张晓丽,28");
        list2.add("翠芬,27");
        list2.add("杨如花,23");
        list2.add("杨似玉,26");
        list2.add("马兰花,32");
        list2.add("杨大嘴,22");

        // 将姓名为3个字的人的信息过滤出来,并且只输出两个
        Stream<String> stream1 = list1.stream()
                .filter(s -> s.split(",")[0].length() == 3)
                .limit(2);

        // 将姓杨的人过滤出来,并且不要第一个姓杨的
        Stream<String> stream2 = list2.stream()
                .filter(s -> s.split(",")[0].startsWith("杨"))
                .skip(1);

        // 将两次结果合并起来
        Stream<String> streamConcat = Stream.concat(stream1, stream2);

        streamConcat.forEach(act->{
   
            Actor actor = new Actor(act.split(",")[0], Integer.parseInt(act.split(",")[1]));
            System.out.println(actor);
        });

    }
}

在这里插入图片描述

相关文章
|
6月前
|
Java API 数据处理
探索 Java 8 中的 Stream 流:构建流的多种方式
探索 Java 8 中的 Stream 流:构建流的多种方式
|
6月前
|
Java
【Java】Stream流是什么,如何使用Stream流?
【Java】Stream流是什么,如何使用Stream流?
81 0
|
6月前
|
存储 Java API
Stream流
Stream流
63 1
|
4月前
|
存储 Java BI
Java基础之stream流最新版,stream流的基本操作
Java基础之stream流最新版,stream流的基本操作
50 0
|
6月前
|
Java 容器
Stream 流常见基本操作
Stream 流常见基本操作
|
5月前
|
存储 Java API
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
Java——Stream流(1/2):Stream流入门、Stream流的创建(认识Stream、体验Stream流、Stream流的使用步骤、获取Stream流的方法)
79 0
|
5月前
|
Java
Java——Stream流(2/2):Stream流的中间方法、终结方法(方法、案例演示)
Java——Stream流(2/2):Stream流的中间方法、终结方法(方法、案例演示)
63 0
|
Java
stream流操作
stream流操作
74 0
|
6月前
|
Java
Stream流教程
Stream流教程
68 0
|
6月前
|
Java
【JavaSE】Stream流
【JavaSE】Stream流
31 0