我希望这个小例子打印出所有可被3整除的数字。
@Test
public void test() {
Observable.range(1, 100)
.groupBy(n -> n % 3)
.toMap(g -> g.getKey())
.flatMap(m -> m.get(0))
.subscribe(System.out::println);
}
println
不会打印任何内容,我不知道为什么。
我将这个示例从一个更复杂的示例中简化了下来,我知道可以用另一种方式完成此操作,但是我需要这种方式,因为有更多的组需要在flatMap
处进行操作。同时。
感谢您的帮助!
答案 0 :(得分:0)
使用方法filter(Predicate<? super T> predicate)
而不是groupBy(..)
来发出满足指定谓词的元素。
Observable.range(1, 100)
.filter(n -> n % 3 == 0)
.toMap(g -> g.getKey())
.flatMap(m -> m.get(0))
.subscribe(System.out::println);
Java Stream-API的工作原理相同:
IntStream.range(1, 100).filter(n -> n%3 == 0).forEach(System.out::println);
// prints 3, 6, 9, 12... on the each line
答案 1 :(得分:0)
groupBy运算符将输入源项目映射到HashMap
,最新值存储在键下。
引用文档:
If more than one source item maps to the same key, the HashMap will contain the latest of those items.
因此,在您的情况下,toMap
运算符将输入序列转换为以下HashMap
:
{0=99, 1=100, 2=98}
要过滤掉指定范围内所有3不可分割的数字,只需按照@Nikolas建议使用filter
运算符即可。
答案 2 :(得分:0)
正如@akarnokd在上面的评论中所述,该示例适用于RxJava v1和v2的最新版本,但不适用于我们使用的版本(com.netflix.rxjava:rxjava-core:jar:0.16 .1(很古老)。可能是由于库本身存在错误。