将RxJava代码正确转换为Kotlin

我正在学习Kotlin和RxJava。 我在Java中拥有这样的代码:

public class MainActivity extends AppCompatActivity { private HashMap<String, Object> cacheToInsertToDb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); cacheToInsertToDb = new HashMap<>(); Observable.interval(1, TimeUnit.SECONDS) .take(30) // up to 30 items .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { cacheToInsertToDb.put(aLong+"", aLong); Log.d("Observable", cacheToInsertToDb.values().toString()); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { } }, new Action() { @Override public void run() throws Exception { } }); Observable.interval(10, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Consumer<Long>() { @Override public void accept(Long aLong) throws Exception { proceedVlues(cacheToInsertToDb.values()); cacheToInsertToDb.clear(); Log.d("CLEARED", cacheToInsertToDb.values().toString()); } }, new Consumer<Throwable>() { @Override public void accept(Throwable throwable) throws Exception { } }, new Action() { @Override public void run() throws Exception { } }); } private void proceedVlues(Collection<Object> values) { for(Object v: values){ if(v instanceof Long){ Log.d("proceedVlues", v+""); } } } } 

但是,当我在AndroidStudio中转换它在IDE中有一堆的错误。

这是Kotlin中的这个代码,在Android Studio中进行了转换:

 class MainActivity : AppCompatActivity() { private var cacheToInsertToDb: HashMap<String, Any>? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) cacheToInsertToDb = HashMap() Observable.interval(1, TimeUnit.SECONDS) .take(30) // up to 30 items .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Consumer<Long> { @Throws(Exception::class) override fun accept(aLong: Long?) { cacheToInsertToDb!!.put(aLong!!.toString() + "", aLong) Log.d("Observable", cacheToInsertToDb!!.values.toString()) } }, Consumer { }, Action { }) Observable.interval(10, TimeUnit.SECONDS) .observeOn(AndroidSchedulers.mainThread()) .subscribe(object : Consumer<Long> { @Throws(Exception::class) override fun accept(aLong: Long?) { proceedVlues(cacheToInsertToDb!!.values) cacheToInsertToDb!!.clear() Log.d("CLEARED", cacheToInsertToDb!!.values.toString()) } }, Consumer { }, Action { }) } private fun proceedVlues(values: Collection<Any>) { for (v in values) { if (v is Long) { Log.d("proceedVlues", v.toString() + "") } } } } 

它给我错误下划线“未解决的引用@Throws”和“接受'覆盖nothig”。 我如何将Java代码正确转换为Kotlin?

2 Solutions collect form web for “将RxJava代码正确转换为Kotlin”

在kotlin中,可以用lambda表达式( doc )替换接口实现,只有一个方法。

就像Java 8一样,Kotlin支持SAM转换。 这意味着只要接口方法的参数类型与Kotlin函数的参数类型匹配,Kotlin函数文本就可以用一个非默认方法自动转换为Java接口的实现。

这给了你:

 .subscribe( { item: Long? -> }, { t: Throwable -> }, {//onComplete }) 

另外,取决于你是否使用RxJava2( doc ):

RxJava 2.x不再接受空值,下面将立即产生NullPointerException或作为一个信号

因为你确定你没有在你的onNext收到一个null,你可以删除安全空检查?

 .subscribe( { item: Long -> }, { t: Throwable -> }, {//onComplete }) 

你可以使用安全的npe和lambda来更新你的代码。 有时从java转换到kotlin的代码需要一些化妆品触摸。

  .subscribe(object : Consumer<Long> { @Throws(Exception::class) override fun accept(aLong: Long?) { cacheToInsertToDb!!.put(aLong!!.toString() + "", aLong) Log.d("Observable", cacheToInsertToDb!!.values.toString()) } }, Consumer { }, Action { }) 

 .subscribe(Consumer<Long?>{ aLong -> cacheToInsertToDb?.put(aLong?.toString() ?: "", aLong) Log.d("Observable", cacheToInsertToDb?.values.toString()) }, Consumer { }, Action { }) 
  • 我如何合并一个<List <List >>与RxJava 2的列表?
  • Recycler中的checkbox勾选为true时,查看项目被immedietaly选中为false
  • 经常调用回调方法来将事件转发到Observable?
  • 扩展函数不会创建新的Observable对象
  • Kotlin&Vertx&Mongo:如何管理异步CRUDfunction?
  • 如何在unit testing中处理嘲讽的RxJava2可观察抛出exception
  • Kotlin和RxJavatypes推断失败
  • Kotlin:如何将使用Thread.sleep的测试转换为RxJava TestScheduler
  • 使用函数引用重写Kotlin中的Java代码会发生SAM类型冲突
  • RxJava和使用Kotlin翻新
  • rxjava2 - 在线程池上执行任务的简单示例,在单个线程上订阅
  • Kotlin language will be the best programming language for Android.