Java学习之Stream流

Stream流的概述

由于JDK 1.8中Lambda表达式的出现,引入了一个全新的Stream流概念。利用流水线思想对于集合,数组数据进行处理和操作。涉及到数据筛选,排序,转换类型,限制个数,最终处理。并且在处理数据的过程中,对于数据的原始空间没有任何的修改,不影响原始数据。

Stream流是对集合(Collection)对象功能的增强,与Lambda表达式结合,可以提高编程效率、间接性和程序可读性。

2.特点

1、代码简洁:函数式编程写出的代码简洁且意图明确,使用stream接口让你从此告别for循环

2、多核友好:Java函数式编程使得编写并行程序非常简单,就是调用一下方法,开发者们无需再去操心线程和锁,Stream内部都已经做好了 。

3.相关方法

Stream流处理的是集合或者数组

Stream流的流程大致为三点:获取Stream流,中间方法处理,最终方法结束。

获取Stream流:创建一条流水线,并把数据放到流水线上准备进行操作

// 集合对象
// 集合对象调用可以直接获取对应当前集合存储元素的 Stream 流对象。
Stream<T> stream();
	
// 数组
// 利用 Arrays 工具类对当前需要按照 Stream 流方式操作的数据进行转换操作,根据当前数组的数据类型和数据存储情况,返回一个对应的 Stream 流对象
Stream<T> Arrays.Stream(T[] t);
	

中间方法:流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。

Stream<T> skip(long n);
	//限制跳过当前 Stream 流对应元素的个数,掐头
Stream<T> limit(long n);
	//限制当前 Stream 对应的元素总个数,去尾

Stream<T> sorted();
	//对当前 Stream 流存储的进行排序操作,要求元素有自然顺序或者遵从 Comparable 接口,默认升序
Stream<T> sorted(Comparator<? super T> com);
	//对当前 Stream 流存储的进行排序操作,排序规则由 Comparator 函数式接口规范

Stream<T> filter(Predicate<? super T> pre);
	//判断过滤当前 Stream 流可以保存的数据条件,满足条件保留,不满足条件移除,过滤规则由 Predicate 接口约束

Stream<T> distinct();
	//当前 Stream 流中对应的所有元素去重擦操作

Stream<R> map(Function<T, R> fun);
	//当前 Stream 存储的数据情况转换为 Function 函数式接口要求的返回值类型,完成类型转换操作。

终结方法:一个Streami流只能有一个终结方法,是流水线上的最后一个操作,Stream 流会自动关闭。对应 Stream 占用的资源空间会被 JVM 收回

long count();
	//返回当前 Stream 流对应的数据元素个数,为终止方法。

void forEach(Consumer<? super T> con);
	//针对于当前 Stream 存储元素的处置方法,为终止方法。
	
<R, A> R collect(Collector<? super T, A, R> collector);
	/**Stream 流对应的元素存储内容,转换为用户要求的 集合对象。终止方法
	*  常用:
	*	Collectors.toList() 目标存储集合类型为 List 集合
	*	Collectors.toSet()  目标存储集合类型为 Set 集合
	*/	
Object[] toArray();
	//Stream 流存储的元素内容转换为 Object 类型数组返回

一个例子:

List 集合中存储 20 个字符串内容,要求使用 Stream 流完成以下操作
    1. 字符串长度超过 5 的保留
    2. 按照字符串长度降序排序
    3. 跳过前 2 个
    4. 保留 5 个元素
    5. 转换为新的 List 集合

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();

        list.add("甲");
        list.add("乙乙");
        list.add("丙丙丙");
        list.add("丁丁丁丁");
        list.add("戊戊戊戊戊");
        list.add("己己己己己己己");
        list.add("庚庚庚庚庚庚庚庚");
        list.add("辛辛辛辛辛辛辛辛辛");
        list.add("壬壬壬壬壬壬壬壬壬壬");
        list.add("癸癸癸癸癸癸癸癸癸癸癸");
        list.add("甲甲甲甲甲甲甲甲甲甲");
        list.add("乙乙乙乙乙乙乙乙乙");
        list.add("丙丙丙丙丙丙丙丙");
        list.add("丁丁丁丁丁丁丁");
        list.add("戊戊戊戊戊戊");
        list.add("己己己己己");
        list.add("庚庚庚庚");
        list.add("辛辛辛");
        list.add("壬壬");
        list.add("癸");

        List<String> list1 = list.stream()
                .filter(s -> s.length() > 5)
                .sorted(Comparator.comparing(String::length))
                .skip(2)
                .limit(5)
                .distinct()
                .collect(Collectors.toList());

        System.out.println(list1);
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值