将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?

在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 { })