首页 > 解决方案 > 将程序集合操作转换为 java 流或反应流

问题描述

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

我想Elem在整个系统中拥有恒定数量的元素,同时places这些元素的可用数量更少或更多。

从视觉上看,它可能看起来像 8 个元素、12 个位置和 3 个对象(每个对象都包含自己的Elems 列表):

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

呼叫 s1requestElem()
呼叫 s1requestElem()
呼叫 s2requestElem()

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

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

呼叫 s3returnElem(4)
呼叫 s3returnElem(8)
呼叫 s3returnElem(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();
        }
    }

}

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

标签: javajava-8java-streamreactive-programming

解决方案


推荐阅读