我已经从网上复制了一个代码,该代码使用Lambda运算符。以下是代码。
Observable.interval(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.zipWith(listObj, (time, item) -> item)
我正在尝试学习rxJava,但无法了解此lambda函数的工作方式,即那些时间和项目变量的工作方式?
如果我在内部文档中打开zipwith()方法,那么下面是它的方法
@SchedulerSupport(SchedulerSupport.NONE)
public final <U, R> Observable<R> zipWith(Iterable<U> other, BiFunction<? super T, ? super U, ? extends R> zipper) {
ObjectHelper.requireNonNull(other, "other is null");
ObjectHelper.requireNonNull(zipper, "zipper is null");
return RxJavaPlugins.onAssembly(new ObservableZipIterable<T, U, R>(this, other, zipper));
}
现在我的列表obj是字符串的数组列表。那么有人可以告诉我这些参数如何与使用Lambda运算符的方法精确地映射,但是有人可以告诉我如何在不使用lambda运算符的情况下编写相同的参数吗?谢谢。
答案 0 :(得分:4)
Lambda运算符指定anonymous function。它是一个没有名称的函数,仅包含参数和“ body”。以我们的lambda函数(time, item) -> item
为例。它接受两个参数time
和item
并返回item
。 zipWith()
接受的功能指定为
zipFunction-结合Observable和Iterable中的项目对以生成要由结果Observable发射的项目的功能
在您的情况下,它将接受来自间隔的当前time
和来自您的item
的{{1}}。然后,您的lambda函数决定如何将这两者结合为listObj
将Observable
。
使用emitt
的简单示例如下:
lambda
我们基本上基于String[] presets = {"A", "B", "C", "D", "CA"};
// Find all matching
List<String> resultList = Arrays.stream(presets)
.filter(x -> x.startsWith("C"))
.collect(Collectors.toList());
函数array
过滤名为presets
的{{1}}的内容。这意味着它将遍历数组,获取元素(lambda
)并根据条件返回x -> x.startsWith("C")
或x
。在这种情况下,它将过滤以true
开头的false
。
您的示例中没有Strings
,在C
中使用了匿名类。对于lambda
,您需要使用RxJava1
而不是RxJava2
。
BiFunction
这将使用您的Func2
并将其与 Observable.interval(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.zipWith(listObj, new Func2<Integer, String, String>() {
public String call(Integer value1, String value2) {
return value2 + String.valueOf(value2);
}
});
中的当前time
连接起来。
答案 1 :(得分:3)
RX的Zip
运算符通过一个函数组合了多个可观察对象。
在您的上下文中,您有2个可观测值,一个观测值发出Long
值,第二个观测值发出String
值。
lambda (time, item) -> item
表示一个接受两个值并返回第二个值的函数。类型是从可观察对象推断出来的,即Long
和String
。
这里是不带lambda(并使用Rx2)的相同代码:
Observable.interval(5, TimeUnit.SECONDS, AndroidSchedulers.mainThread())
.zipWith(listObj, new BiFunction<Long, String, String>() {
@Override
public String apply(Long time, String item) throws Exception {
return item;
}
});
如果需要使用Rx1,而不必使用BiFunction
,则必须使用Func2
。