动手模拟 java Flux

复制代码
MyFluxTest.java:
java 复制代码
 
import java.util.ArrayList;
import java.util.List;


public class MyFluxTest {

    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        names.add( "张三" );
        names.add( "李四" );
        names.add( "王五" );

        MyFlux flux_name = MyFlux.fromList(names);

        MyFlux flux_name1 = flux_name.map(name -> {
            return name + " 111 ";
        });

        MyFlux flux_name2 = flux_name1.map(name -> {
            return name + " 222 ";
        });

        MyFlux flux_name3 = flux_name2.map(name -> {
            return name + " 333 ";
        });

        flux_name3.subscribe( name->{
            System.out.println( name );
        } );
    }
}
复制代码
MyConsumer.java:
java 复制代码
public interface MyConsumer {

    void consume( String element );
}
复制代码
MyFlux.java:
java 复制代码
import lombok.Getter;
import lombok.Setter;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;



@Getter
@Setter
public class MyFlux implements Serializable {

    // 只有初始的那个 flux 的 innerList 才有值,即 prevFlux == null 的那个 flux
    private List<String> innerList;

    private MyFlux prevFlux;
    private MyFlux nextFlux;

    private MyFunction function; // 是哪个 flux 调用的 map,则传递的 function 就是 谁的 function

    private MyConsumer consumer;

    public static MyFlux fromList( List<String> list ) {
        MyFlux flux_new = new MyFlux();
        flux_new.innerList = new ArrayList<>();
        flux_new.setPrevFlux( null );
        flux_new.setNextFlux( null );
        for( String element:list ){
            flux_new.innerList.add( element );
        }
        return flux_new;
    }

    public MyFlux map(MyFunction function) {
        if( function == null ){
            return null;
        }
        MyFlux flux_new = new MyFlux();
        flux_new.setPrevFlux( this );
        flux_new.setNextFlux( null );
        flux_new.setFunction( function );

        this.setNextFlux( flux_new );

        return flux_new;
    }

    public void subscribe(MyConsumer consumer) {
        List<MyFlux> fluxList = new ArrayList<>();
        List<String> initInnerList = this.addMeToFluxListAndReturnInitInnerList( fluxList );
        int size = fluxList.size();

        int elementCount = initInnerList.size();
        for (int j = 0; j < elementCount; j++) {
            String element = initInnerList.get( j );
            for (int i = size -1; i >=0 ; i--) {
                MyFlux flux = fluxList.get(i);
                if( flux.function == null ){
                    continue;
                }
                element =  flux.function.apply(element);
            }
            consumer.consume( element );
        }
    }

    private List<String> addMeToFluxListAndReturnInitInnerList(List<MyFlux> fluxList) {
        fluxList.add( this );
        if( this.prevFlux == null ){
            return this.innerList;
        }
        return this.prevFlux.addMeToFluxListAndReturnInitInnerList( fluxList );
    }
}
复制代码
MyFunction.java:
java 复制代码
public interface MyFunction {
    String apply( String element );
}
相关推荐
若鱼191910 小时前
SpringBoot4.0新特性-Observability让生产环境更易于观测
java·spring
觉醒大王10 小时前
强女思维:着急,是贪欲外显的相。
java·论文阅读·笔记·深度学习·学习·自然语言处理·学习方法
喜欢喝果茶.10 小时前
QOverload<参数列表>::of(&函数名)信号槽
开发语言·qt
亓才孓10 小时前
[Class类的应用]反射的理解
开发语言·python
努力学编程呀(๑•ี_เ•ี๑)10 小时前
【在 IntelliJ IDEA 中切换项目 JDK 版本】
java·开发语言·intellij-idea
码农小卡拉10 小时前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
向上的车轮10 小时前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu10 小时前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
island131410 小时前
CANN GE(图引擎)深度解析:计算图优化管线、内存静态规划与异构任务的 Stream 调度机制
开发语言·人工智能·深度学习·神经网络
跳动的梦想家h10 小时前
环境配置 + AI 提效双管齐下
java·vue.js·spring