一文带你了解java stream, 太强了

本文深入探讨了Java 8的Stream API,揭示了它如何通过流式处理增强集合操作,实现更高效、简洁的代码。文章介绍了Stream的简介,对比了传统与Stream操作的区别,并详细讲解了获取流、中间操作(如过滤、映射、归约)和收集操作的用法。此外,还讨论了并行流的概念及其潜在的性能提升。
摘要由CSDN通过智能技术生成

说起stream的流, 在平时的工作中, 很多同事都在用, 而且用的很牛逼, 代码的效率也是溜溜的, 真的牛逼的不行了, 自己一直想学习一下, 虽然在开发中也慢慢学习了一些, 但是感觉还是一直没有掌握其精髓, 今天有空, 赶紧总结一下吧, 也算是了结自己一个小小的心愿

1. stream流简介

Stream作为 Java 8的一大亮点,它与 java.io 包里的 InputStream和 OutputStream是完全不同的概念。它也不同于 StAX 对 XML 解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的Stream。Java 8 中的 Stream 是对集合(Collection)对象功能的增强,它专注于对集合对象进行各种非常便利、高效的聚合操作(aggregate operation),或者大批量数据操作 (bulk data operation)。Stream API 借助于同样新出现的Lambda表达式,极大的提高编程效率和程序可读性。同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势,使用fork/join并行方式来拆分任务和加速处理过程。通常编写并行代码很难而且容易出错, 但使用Stream API无需编写一行多线程的代码,就可以很方便地写出高性能的并发程序。所以说,Java 8 中首次出现的java.util.stream 是一个函数式语言+多核时代综合影响的产物。

Stream 不是集合元素,它不是数据结构并不保存数据,它是有关算法和计算的,它更像一个高级版本的 Iterator。原始版本的Iterator,用户只能显式地一个一个遍历元素并对其执行某些操作;高级版本的 Stream,用户只要给出需要对其包含的元素执行什么操作,比如 “过滤掉长度大于 10 的字符串”、“获取每个字符串的首字母”等,Stream 会隐式地在内部进行遍历,做出相应的数据转换。

Stream 就如同一个迭代器(Iterator),单向,不可往复,数据只能遍历一次,遍历过一次后即用尽了,就好比流水从面前流过,一去不复返。

而和迭代器又不同的是,Stream 可以并行化操作,迭代器只能命令式地、串行化操作。顾名思义,当使用串行方式去遍历时,每个 item 读完后再读下一个 item。而使用并行去遍历时,数据会被分成多个段,其中每一个都在不同的线程中处理,然后将结果一起输出。Stream 的并行操作依赖于 Java7 中引入的 Fork/Join 框架(JSR166y)来拆分任务和加速处理过程。Java 的并行 API 演变历程基本如下:

1.0-1.4 中的 java.lang.Thread5.0 中的 java.util.concurrent6.0 中的 Phasers 等7.0 中的 Fork/Join 框架8.0 中的 LambdaStream 的另外一大特点是,数据源本身可以是无限的。

2. 传统和stream的对比

我们先来看一个示例:

import java.util.ArrayList;
import java.util.List;

public class DemoForEach {
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("你好");
            list.add("我好");
            list.add("大家好");
            list.add("hello world");
            list.add("thanks");
            for (String name : list) {
                System.out.println(name);
            }
        }
}

Java8 之前的做法

import java.util.ArrayList;
import java.util.List;
    public class DemoNormalFilter {
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("你好");
            list.add("我好");
            list.add("大家好");
            list.add("hello world");
            list.add("thanks");
            List<String> haoList = new ArrayList<>();
            for (String name : list) {
                if (name.endWith("好")) {
                    haoList.add(name);
                }
            }
            List<String> shortList = new ArrayList<>();
            for (String name : haoList) {
                if (name.length() == 3) {
                    shortList.add(name);
                }
            }
            for (String name : shortList) {
                System.out.println(name);
            }
        }
    }

这段代码中含有三个循环,每一个作用不同:

       ① 首先筛选出所有以"好"结尾的;

       ② 然后筛选三个字;

       ③ 最后进行对结果进行打印输出。

而我们每次都需要进行一个循环, 是不是感觉很麻烦啊, 那就没有更加简便的方法吗?

stream的更优写法

import java.util.ArrayList;
import java.util.List;

    public class DemoStreamFilter {
        public static void main(String[] args) {
            List<String> list = new ArrayList<>();
            list.add("你好");
            list.add("我好");
            list.add("大家好");
            list.add("hello world");
            list.add("thanks");
            list.stream()
                    .filter(s -> s.startsWith("张"))
                    .filter(s -> s.length() == 3)
                    .forEach(System.out::println);
        }
    }

3. 流式思想概述

整体来看,流式思想类似于工厂车间的“生产流水线”。

由上面的例子可以看出,java8的流式处理极大的简化了对于集

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值