动手模拟 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 );
}
相关推荐
明月看潮生8 分钟前
青少年编程与数学 02-003 Go语言网络编程 15课题、Go语言URL编程
开发语言·网络·青少年编程·golang·编程与数学
雷神乐乐12 分钟前
File.separator与File.separatorChar的区别
java·路径分隔符
小刘|17 分钟前
《Java 实现希尔排序:原理剖析与代码详解》
java·算法·排序算法
南宫理的日知录19 分钟前
99、Python并发编程:多线程的问题、临界资源以及同步机制
开发语言·python·学习·编程学习
逊嘘36 分钟前
【Java语言】抽象类与接口
java·开发语言·jvm
Half-up38 分钟前
C语言心型代码解析
c语言·开发语言
morris13143 分钟前
【SpringBoot】Xss的常见攻击方式与防御手段
java·spring boot·xss·csp
Source.Liu1 小时前
【用Rust写CAD】第二章 第四节 函数
开发语言·rust
monkey_meng1 小时前
【Rust中的迭代器】
开发语言·后端·rust
余衫马1 小时前
Rust-Trait 特征编程
开发语言·后端·rust