【问题标题】:how to replace an rx java expression with lambda?如何用 lambda 替换 rx java 表达式?
【发布时间】:2017-11-14 21:25:55
【问题描述】:

我不断得到表达式可以用 Java 8 的 lambda 替换。我该怎么做?这是我收到该消息的一种表达方式:

Observable.create(new ObservableOnSubscribe<Pair>() {
            @Override
            public void subscribe(@io.reactivex.annotations.NonNull ObservableEmitter<Pair> observableEmitter) throws Exception { ...

有什么想法吗?

【问题讨论】:

  • @GabeSechan 他们不一样。 this 对他们来说是不同的;在 lambda 的情况下可能会创建更少的对象 - 每个调用站点一个;一个是通过invokedynamic在运行时创建的,另一个不是,还有更多区别
  • @GabeSechan 首先,我的评论不是是为了以任何方式说服你;这只是为了表明存在差异 - 对某些人来说很重要,而对其他人来说显然不是那么重要。
  • @GabeSechan 作为旁注,invokedynamic is(java-9 中的字符串连接)已被使用,并将在 jdk-10 中进一步利用和使用。跨度>
  • @GabeSechan IMO 你偏离了主题......但让我们停在这里:有一个差异,可能对某些人来说很重要

标签: android lambda java-8 rx-java rx-java2


【解决方案1】:

由于任何具有SAM 的接口本质上都是函数式接口,因此我们可以这样做:

Observable.create(e -> { /* do logic */ });

请注意,如果在create 范围内发生任何异常,上述方法不会冒泡。要使用 lambdas(匿名函数)完成此类行为,您可以创建一个包装方法并在那里执行逻辑,即:

public void subscribeWrapper(ObservableEmitter<Pair> e) throws java.lang.Exception {
    // do logic
}

那么你会这样做:

Observable.create(e -> subscribeWrapper(e));

另一方面,您可以忽略创建上述方法并在 lambda 语句块中使用 try/catch 并从那里重新抛出异常。

【讨论】:

  • 即使这是正确的 - 她的匿名内部类确实会抛出 Exception... :)
【解决方案2】:

这是为此创建 lambda 的方式:

observableEmitter -> {
    // your code here
}

你不需要匿名函数或类似的东西。

把它放在给定的代码中:

Observable.create(observableEmitter -> {
    // your code here
});

您只需将 new ObservableOnSubs... 位替换为 lambda。

【讨论】:

  • 它要求替换新的 ObservableOnSubscribe(),订阅代码在哪里?你能解释一下我的代码吗?
  • 编辑了我的答案,澄清了你的问题。
  • 另外我想补充一点:option + enter(在mac上),自动将表达式替换为lambda表达式。
猜你喜欢
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多