还可以从Android Studio编译和运行:
val greeted = "World".also { println("Hello $it") }
Run Code Online (Sandbox Code Playgroud)
然而,编辑突出显示also并it作为错误,并没有给intellisense提供任何帮助.申请仍然有效,当我去源I可以看到两者的定义apply和also.如何让Android Studio识别also?
我在早期版本中也遇到过这个问题.
在 ViewModel 中获得 Android Room DAO 的最佳方法是什么?
基于分页库示例,我编写了这个 ViewModel:
class MyViewModel(myDao: MyDao) : ViewModel() {
val data = myDao.get().create(
/* initial load position */ 0,
PagedList.Config.Builder()
.setPageSize(50)
.setPrefetchDistance(50)
.build())
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试获取一个实例
val viewModel = ViewModelProviders.of(this).get(MyViewModel::class.java)
Run Code Online (Sandbox Code Playgroud)
尝试运行此程序时出现异常:
java.lang.RuntimeException: Unable to start activity ComponentInfo{....MyActivity}: java.lang.RuntimeException: Cannot create an instance of class ...MyViewModel
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2817)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2892)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1593)
at android.os.Handler.dispatchMessage(Handler.java:105)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6541)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:767)
Caused by: java.lang.RuntimeException: Cannot create an …Run Code Online (Sandbox Code Playgroud) 我需要映射一个列表并检索第一个非null元素,我需要将map操作短路,就像它应该在Java 8流API中一样.有没有Java 8流可以在Kotlin中做到这一点?
我创建了自己的扩展方法来执行此操作:
fun <T, R> Iterable<T>.firstNonNullMapping(transform: (T) -> R?): R? {
for (element in this) {
val result = transform(element)
if (result != null) {
return result
}
}
return null
}
Run Code Online (Sandbox Code Playgroud)
测试证明这是有效的
val firstNonNullMapping = listOf(null, 'a', 'b')
.firstNonNullMapping {
assertNotEquals(it, 'b') // Mapping should be stopped before reaching 'b'
it
}
assertEquals(firstNonNullMapping, 'a')
Run Code Online (Sandbox Code Playgroud)
但是,IntelliJ建议我用更整洁的东西替换我的for循环
return this
.map { transform(it) }
.firstOrNull { it != null }
Run Code Online (Sandbox Code Playgroud)
问题是这将映射iterable的所有元素,并且对于我的第一个非null元素停止的用例是必不可少的.