将程序收集操作转换为Java流或响应流

时间:2018-07-02 20:04:41

标签: java java-8 java-stream reactive-programming

如何使用Flux和Mono将这种“旧式”过程Java代码转换为至少Java 8流或响应流。 我的目标是为在并发非阻塞Web环境中使用该代码奠定良好的基础。

我希望整个系统中有固定数量的Elem个元素,同时要为这些元素提供更多或更少的places

从视觉上看,它看起来像是8个元素,12个地方和3个对象(其中每个对象都有自己的Elem s列表):

s1 [Elem(1), Elem(2), Elem(3), Elem(4)]
s2 [Elem(5), Elem(6), Elem(7), Elem(8)]
s3 [FREE, FREE, FREE, FREE]

呼吁s1 requestElem()
要求s1 requestElem()
要求s2 requestElem()

s1 [Elem(1), Elem(2), FREE, FREE]
s2 [Elem(5), Elem(6), Elem(7), FREE]
s3 [FREE, FREE, FREE, FREE]

...目前,这三个元素正等待以随机顺序返回...

呼吁s3 returnElem(4)
要求s3 returnElem(8)
要求s3 returnElem(2)

s1 [Elem(1), Elem(2), FREE, FREE]
s2 [Elem(5), Elem(6), Elem(7), FREE]
s3 [Elem(4), Elem(8), Elem(3), FREE]

这些操作的顺序当然可能有所不同,并且是随机选择的。

class MyClass {
    private String name;
    private final int size = 4;     // size of s1, s2, s3
    private BlockingDeque<Elem> places;
    private int numOfElem;
    private BlockingDeque<Elem> additionalElems;

    public void requestElem() {
        if (numOfElem > size) {
            numOfElem--;
            additionalElems.pop();
            return;
        }
        if(!places.isEmpty()){
            places.pop();
            numOfElem = places.size();
        } else {
            System.out.println("empty: " + name + ", waiting for new elements...");
        }
    }

    public void returnElem(int id) {
        if (numOfElem >= size) {
            numOfElem++;
            additionalElems.push(new Elem(id));
            return;
        }
        if(places.size() < size){
            places.push(new Elem(id));
            numOfBicycles = places.size();
        }
    }

}

这可能吗?您可以提供一些有用的提示或资源给我吗?

0 个答案:

没有答案