无法理解Lambda->运算符

时间:2018-08-07 06:49:53

标签: android lambda rx-java2

我已经从网上复制了一个代码,该代码使用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运算符的情况下编写相同的参数吗?谢谢。

2 个答案:

答案 0 :(得分:4)

Lambda运算符指定anonymous function。它是一个没有名称的函数,仅包含参数和“ body”。以我们的lambda函数(time, item) -> item为例。它接受两个参数timeitem并返回itemzipWith()接受的功能指定为

  

zipFunction-结合Observable和Iterable中的项目对以生成要由结果Observable发射的项目的功能

在您的情况下,它将接受来自间隔的当前time和来自您的item的{​​{1}}。然后,您的lambda函数决定如何将这两者结合为listObjObservable

使用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表示一个接受两个值并返回第二个值的函数。类型是从可观察对象推断出来的,即LongString

这里是不带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