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);
        });

    }
}

在这里插入图片描述

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杀死一只知更鸟debug

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值