Stream流 (全方位 分析源码)




并行流采用链式编程 lambda表达式 Stream流式计算 函数式接口

1.一个数组怎么转化成了流?

在JDK1.8以后,加入流stream

//Collection接口中也加入转换方法
List<String> list = new ArrayList<String>();
Stream<String> parallelStream = list.stream().........
Stream<String> parallelStream = list.parallelStream()......

这是一个list集合 通过stream()方法变成串行流,
			通过parallelStream()方法变成并行流。

1.1走一遍源码

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.BaseStream

先看一下继承BaseStream的接口
在这里插入图片描述

2.1认识一下BaseStream

public interface BaseStream<T, S extends BaseStream<T, S>>
        extends AutoCloseable {
    /**
     * Returns an iterator for the elements of this stream.
     * 返回此流元素的迭代器
     */
    Iterator<T> iterator();

    /**
     * Returns a spliterator for the elements of this stream.
     * 返回此流元素的拆分器。
     */
    Spliterator<T> spliterator();

    /**
     * 此流是否将并行执行?
     */
    boolean isParallel();

    /**
     * 返回一个等价的串行流,可能是它自己,因为它已经是串行流,基础流状态被修改为连续的。
     */
    S sequential();

    /**
     * 返回一个等价的并行流。可能会返回本身,或者因为流已经是平行的,或者因为底层流状态被修改为并行。
     */
    S parallel();

    /**
     * 返回一个无序流
     */
    S unordered();

    /**
     * 关闭运行 时 处理程序的流
     */
    S onClose(Runnable closeHandler);

    /**
     * 关闭此流
     */
    @Override
    void close();
}

3.Stream流

Stream接口是继承于BaseStream
public interface Stream<T> extends BaseStream<T, Stream<T>>	

3.1Stream可以直接转化成其他三种流IntStream LongStream DoubleStream

在这里插入图片描述
通过这三个方法,直接转换

    IntStream mapToInt(ToIntFunction<? super T> mapper);

    LongStream mapToLong(ToLongFunction<? super T> mapper);

    DoubleStream mapToDouble(ToDoubleFunction<? super T> mapper);

点入LongStream接口
在这里插入图片描述

3.2 使用四种函数式接口的方法

//过滤 断定型接口
Stream<T> filter(Predicate<? super T> predicate);

//函数型 
<R> Stream<R> map(Function<? super T, ? extends R> mapper);

//将多个Stream连接成一个Stream,这时候不是用新值取代Stream的值,与map有所区别,这是重新生成一个Stream对象取而代之。
<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper);
IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
LongStream flatMapToLong(Function<? super T, ? extends LongStream> mapper);
DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream> mapper);

//排序 (和断定型是否排序)
Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);

//stream.peek的操作是返回一个新的stream的,且设计的初衷是用来debug调试的,因此使用steam.peek()必须对流进行一次处理再产生一个新的stream。
Stream<T> peek(Consumer<? super T> action);

//传入消费 不需要进行别的操作 无返回
void forEach(Consumer<? super T> action);

// 1.恒等式累积函数的恒等式值
// 2.函数式接口 传入2个参数,返回一个参数
T reduce(T identity, BinaryOperator<T> accumulator);
等等方法

XXXStream接口(LongStream)

//需要传入开始节点和结束节点两个参数,返回的是一个有序的LongStream。
//包含开始节点和结束节点两个参数之间所有的参数,间隔为1.
range(long startInclusive, final long endExclusive)

//和上面方法类似,只是包含了endExclusive边界值
rangeClosed(long startInclusive, final long endExclusive)

//转换成并行流
parallel()

等等

了解下ForkJoin框架

在ForkJoin框架下,进行使用
ForkJoin框架

大量数据中:效率Stream并行流>ForkJoin>for

少了数据中:for>效率Stream并行流>ForkJoin

查看注释基本就可以了解大部分。

Spring Cloud Stream 是一个基于 Spring Boot 的框架,用于构建消息驱动的微服务应用程序。它提供了一种简单的方式来在微服务之间传递消息,支持多种消息代理(如 RabbitMQ、Kafka 等)。 在 Spring Cloud Stream 中,消息是通过绑定器(Binder)来发送和接收的。绑定器是一个抽象的概念,它将应用程序连接到消息代理。Spring Cloud Stream 提供了多个绑定器实现,如 RabbitMQ Binder、Kafka Binder 等。 Spring Cloud Stream 的核心组件是消息通道(Message Channels),它是一个抽象的消息传递管道。消息通道可以是输入通道(Input Channel)或输出通道(Output Channel)。输入通道用于接收消息,输出通道用于发送消息。通过配置绑定器和消息通道,我们可以将应用程序连接到消息代理,实现消息传递。 在源码层面,Spring Cloud Stream 的核心实现是在 spring-cloud-stream-binder 模块中。该模块包含了多个子模块,每个子模块都实现了一个绑定器。比如,spring-cloud-stream-binder-rabbit 实现了 RabbitMQ Binder,spring-cloud-stream-binder-kafka 实现了 Kafka Binder。在这些子模块中,我们可以看到各种绑定器的具体实现细节,包括如何连接到消息代理、如何序列化和反序列化消息、如何将消息发送到消息通道等。 除了绑定器之外,Spring Cloud Stream 还提供了一些高级特性,如消息转换器(Message Converters)、分区器(Partitioners)等。这些特性都是在 spring-cloud-stream-core 模块中实现的。 总的来说,Spring Cloud Stream源码实现比较复杂,需要深入理解消息传递、序列化、反序列化等相关知识。如果想要深入了解 Spring Cloud Stream 的实现细节,可以查看官方文档和源码
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一只小小狗

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

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

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

打赏作者

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

抵扣说明:

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

余额充值