正确地将RxJava代码转换为Kotlin

正确地将RxJava代码转换为Kotlin,java,android,kotlin,rx-java,rx-java2,Java,Android,Kotlin,Rx Java,Rx Java2,我正在学习Kotlin和RxJava。我在Java中有这样的代码: public class MainActivity extends AppCompatActivity { private HashMap<String, Object> cacheToInsertToDb; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState);

我正在学习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+"");
            }
        }
   }
}
public类MainActivity扩展了AppCompatActivity{
私有HashMap cacheToInsertToDb;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
cacheToInsertToDb=新HashMap();
可观测间隔(1,时间单位。秒)
.take(30)//最多30项
.observeOn(AndroidSchedulers.mainThread())
.订阅(新消费者){
@凌驾
public void accept(长期)引发异常{
cacheToInsertToDb.put(沿+“”,沿);
Log.d(“可观察”,cacheToInsertToDb.values().toString());
}
},新消费者(){
@凌驾
public void accept(Throwable Throwable)引发异常{
}
},新行动(){
@凌驾
public void run()引发异常{
}
});
可观测间隔(10,时间单位,秒)
.observeOn(AndroidSchedulers.mainThread())
.订阅(新消费者){
@凌驾
public void accept(长期)引发异常{
proceedVlues(cacheToInsertToDb.values());
cacheToInsertToDb.clear();
Log.d(“清除”,cacheToInsertToDb.values().toString());
}
},新消费者(){
@凌驾
public void accept(Throwable Throwable)引发异常{
}
},新行动(){
@凌驾
public void run()引发异常{
}
});
}
私有void进程(集合值){
用于(对象v:值){
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() + "")
        }
      }
   }
}
class MainActivity:AppCompatActivity(){
私有变量cacheToInsertToDb:HashMap?=null
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
cacheToInsertToDb=HashMap()
可观测间隔(1,时间单位。秒)
.take(30)//最多30项
.observeOn(AndroidSchedulers.mainThread())
.订阅(对象:消费者){
@抛出(异常::类)
覆盖乐趣接受(沿:长?){
cacheToInsertToDb!!.put(沿!!.toString()+“”,沿)
Log.d(“可观察”,cacheToInsertToDb!!.values.toString())
}
},消费者{},操作{})
可观测间隔(10,时间单位,秒)
.observeOn(AndroidSchedulers.mainThread())
.订阅(对象:消费者){
@抛出(异常::类)
覆盖乐趣接受(沿:长?){
proceedVlues(cacheToInsertToDb!!.values)
cacheToInsertToDb!!.clear()
Log.d(“清除”,cacheToInsertToDb!!.values.toString())
}
},消费者{},操作{})
}
私人娱乐程序(值:集合){
对于(v值){
if(v长){
Log.d(“proceedVlues”,v.toString()+“”)
}
}
}
}

它在“未解析的@Throws引用”和“accept”覆盖nothig”下面给了我一个错误下划线。如何将Java代码正确地转换为Kotlin

您可以使用安全npe和lambdas更新代码。有时,从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(对象:消费者){
@抛出(异常::类)
覆盖乐趣接受(沿:长?){
cacheToInsertToDb!!.put(沿!!.toString()+“”,沿)
Log.d(“可观察”,cacheToInsertToDb!!.values.toString())
}
},消费者{},操作{})

.subscribe(消费者{aLong->
cacheToInsertToDb?.put(沿?.toString()?:“”,沿)
Log.d(“可观察”,cacheToInsertToDb?.values.toString())
},消费者{},操作{})

您可以使用安全npe和lambdas更新代码。有时,从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(对象:消费者){
@抛出(异常::类)
覆盖乐趣接受(沿:长?){
cacheToInsertToDb!!.put(沿!!.toString()+“”,沿)
Log.d(“可观察”,cacheToInsertToDb!!.values.toString())
}
},消费者{},操作{})

.subscribe(消费者{aLong->
cacheToInsertToDb?.put(沿?.toString()?:“”,沿)
Log.d(“可观察”,cacheToInsertToDb?.values.toString())
},消费者{},操作{})

在kotlin中,对于lambda表达式(),您可以使用一种方法替换接口实现

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

这给了你:

.subscribe(
        { item: Long? ->

        },
        { t: Throwable ->

        },
        {//onComplete

        })
另外,根据您使用的是RxJava2():

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

正因为如此,你确信你没有收到
.subscribe(
        { item: Long ->

        },
        { t: Throwable ->

        },
        {//onComplete

        })