如何使RbJava 2中的可观察对象发出另一个可观察对象发出的组合项?

时间:2019-11-19 14:51:51

标签: java android rx-java rx-java2 android-livedata

我有一个Observable,它发出随机的位/布尔值。我需要使另一个Observable结合这些随机位来创建并发出随机整数。每当基础Observable发出一个位时,该Observable将该位附加到位字符串中,一旦该位字符串达到特定长度,此Observable便将其转换为整数并发出它。

这是插图: illustration

这是我使用Android LiveData实施的方法:

final StringBuilder bitStringBuilder = new StringBuilder();
final MediatorLiveData<Integer> integerLiveData = new MediatorLiveData<>();
integerLiveData.addSource(
        randomSource.getBooleanLiveData(),
        new Observer<Boolean>() {
            @Override
            public void onChanged(Boolean b) {
                bitStringBuilder.append(b ? '1' : '0');
                if (bitStringBuilder.length() == 31) {
                    integerLiveData.setValue(Integer.parseInt(bitStringBuilder.toString(), 2));
                    bitStringBuilder.setLength(0); // clear the bit string builder
                }
            }
        }
);

如何使用RxJava 2实现这一目标?

1 个答案:

答案 0 :(得分:3)

缓冲位:

source
.buffer(31)
.map(bits -> {
    int result = 0;
    for (int b : bits) {
        result = (result << 1) | (b ? 1 : 0);
    }
    return result;
})