动手模拟 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 );
}
相关推荐
DES 仿真实践家1 小时前
【Day 11-N22】Python类(3)——Python的继承性、多继承、方法重写
开发语言·笔记·python
YuTaoShao2 小时前
【LeetCode 热题 100】56. 合并区间——排序+遍历
java·算法·leetcode·职场和发展
Code Warrior2 小时前
【每日算法】专题五_位运算
开发语言·c++
程序员张32 小时前
SpringBoot计时一次请求耗时
java·spring boot·后端
沐知全栈开发4 小时前
HTML DOM 访问
开发语言
llwszx5 小时前
深入理解Java锁原理(一):偏向锁的设计原理与性能优化
java·spring··偏向锁
脑袋大大的5 小时前
JavaScript 性能优化实战:减少 DOM 操作引发的重排与重绘
开发语言·javascript·性能优化
云泽野5 小时前
【Java|集合类】list遍历的6种方式
java·python·list
二进制person6 小时前
Java SE--方法的使用
java·开发语言·算法
OneQ6666 小时前
C++讲解---创建日期类
开发语言·c++·算法