动手模拟 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 );
}
相关推荐
YUFENGSHI.LJ10 分钟前
Flutter 高性能 Tab 导航:懒加载与状态保持的最佳实践
开发语言·flutter·1024程序员节
wudl556610 分钟前
JDK 21 API增强详解
java·开发语言·windows
β添砖java12 分钟前
JS基础Day01
开发语言·javascript·ecmascript
学习编程的Kitty16 分钟前
JavaEE初阶——多线程(3)线程安全
java·开发语言·jvm
Skrrapper19 分钟前
【C++】C++ 中的 map
开发语言·c++
寄思~1 小时前
python批量读取word表格写入excel固定位置
开发语言·python·excel
workflower2 小时前
微软PM的来历
java·开发语言·算法·microsoft·django·结对编程
惊讶的猫2 小时前
c++基础
开发语言·c++
江湖一码农2 小时前
[小白]spring boot接入emqx
java·数据库·spring boot
人间乄惊鸿客2 小时前
python — day9
开发语言·python