代码之家  ›  专栏  ›  技术社区  ›  Pritish

无法理解Lambda->运算符

  •  1
  • Pritish  · 技术社区  · 6 年前

    我从网络上复制了一个使用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));
    }
    

    现在我的list obj是字符串的arraylist,那么有人能告诉我这些参数是如何与使用Lambda运算符的方法完全映射的吗,而有人能告诉我如何在不使用Lambda运算符的情况下编写相同的参数吗?谢谢。

    2 回复  |  直到 6 年前
        1
  •  3
  •   Lino    6 年前

    处方药 Zip 运算符通过一个函数组合多个观测值。 在你的上下文中,你有两个可观察到的,一个发出 Long 价值观和第二个价值观 String 价值观。

    羔羊 (time, item) -> item 指接受两个值并返回第二个值的函数。类型是根据观测值推断出来的,即 字符串 .

    下面是没有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 .

        2
  •  4
  •   AndrejH    6 年前

    Lambda运算符指定 anonymous function . 它是一个没有名字的函数,只包含参数和“body”。如果我们以lambda函数为例 (time, item) -> item . 它接受两个参数, time item 并返回 项目 . 可接受的功能 zipWith() 指定为

    zipFunction -一种函数,它将可观测数据和可观测数据中的一对数据项组合起来,生成由结果可观测数据发出的数据项

    在你的情况下,它将接受当前 时间 从间隔和 项目 从你的 listObj . 然后lambda函数决定如何将这两者组合成 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 基于 兰姆达 功能 x -> x.startsWith("C") . 这意味着它将遍历数组,获取元素( x )然后返回一个 true false 基于一个条件。在这种情况下,它会过滤掉那些 Strings 一开始 C .

    你的榜样没有 兰姆达 ,在中使用匿名类 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);
          }
      });
    

    这会让你 时间 并将其与当前 项目 列表对象 .