例如,我有一个字符串列表,如:
val list = listOf("a", "b", "c", "d")
Run Code Online (Sandbox Code Playgroud)
我想将它转换为地图,其中字符串是键.
我知道我应该使用.toMap()函数,但我不知道如何,我还没有看到它的任何例子.
我正在使用lateinit属性,以避免连续的空值检查?运营商.我有很多在getViews()函数中第一次分配的View属性.如果那个函数不存在,我的应用程序将从一个NPE,从Kotlin代码崩溃.
在我看来,lateinit属性基本上破坏了语言的漂亮的空安全功能.我知道它们是在M13中引入的,因为它有更好的框架支持,但是它值得吗?
或者我在这里遗漏了什么?
这是代码:
package com.attilapalfi.exceptional.ui
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.view.View
import android.widget.Button
import android.widget.ImageView
import android.widget.TextView
import com.attilapalfi.exceptional.R
import com.attilapalfi.exceptional.dependency_injection.Injector
import com.attilapalfi.exceptional.model.Exception
import com.attilapalfi.exceptional.model.ExceptionType
import com.attilapalfi.exceptional.model.Friend
import com.attilapalfi.exceptional.persistence.*
import com.attilapalfi.exceptional.rest.ExceptionRestConnector
import com.attilapalfi.exceptional.ui.helpers.ViewHelper
import com.attilapalfi.exceptional.ui.question_views.QuestionYesNoClickListener
import com.google.android.gms.maps.MapView
import java.math.BigInteger
import javax.inject.Inject
public class ShowNotificationActivity : AppCompatActivity(), QuestionChangeListener {
@Inject
lateinit val exceptionTypeStore: ExceptionTypeStore
@Inject
lateinit val friendStore: FriendStore
@Inject
lateinit val imageCache: ImageCache
@Inject
lateinit val metadataStore: MetadataStore
@Inject
lateinit val viewHelper: ViewHelper
@Inject
lateinit val exceptionInstanceStore: ExceptionInstanceStore
@Inject …Run Code Online (Sandbox Code Playgroud) 我正在寻找一个工具,Intellij Idea插件,或任何能够从Kotlin源文件生成UML类图的工具.
Intellij Idea 15的"显示图..."工具仅适用于.java文件.
谷歌没有帮助,但我仍然希望有机会为此找到一个工具.
我有一个列表,我要对其进行一些转换,但不包括前两个元素。我怎样才能做到最好?像这样:
list.reversed().take(list.size - 2)...(my transformations)
Run Code Online (Sandbox Code Playgroud)
要么
list.excludeFirstN(2)...(my transformations)
Run Code Online (Sandbox Code Playgroud) 我正在编写一个程序,我正在使用工厂模式.我有一个名为AssetFundCalculator的接口和一个名为AssetFundCalculatorImpl的类,它实现了该接口.
该AssetFundValidator类验证一些投入,并能实例化一个有效AssetFundCalculatorImpl.
我想如果程序的其余部分只知道接口,而不是AssetFundCalculatorImpl,那么只有AssetFundValidator可以实例化它.
我的包结构如下所示:
在Java中,我会将包可见性修饰符赋予AssetFundCalculatorImpl类或它的构造函数,它可以解决问题,但在Kotlin中,没有包可见性修饰符.
这个问题有方法解决吗?我不想将此代码放到单独编译的模块中,因此内部修饰符不起作用.
我想初始化我班级的属性.因为我大量使用Kotlin的功能元素,所以我想将这些初始化放在命名良好的函数中,以提高代码的可读性.问题是我不能分配val属性,如果代码不在init块中,而是在从init块调用的函数中.
如果属性是val,是否可以将类的初始化拆分为不同的函数?
这是代码:
val socket: DatagramSocket = DatagramSocket()
val data: ByteArray = "Cassiopeiae server discovery packet".toByteArray()
val broadcastAddresses: List<InetAddress>
init {
socket.broadcast = true
val interfaceAddresses = ArrayList<InterfaceAddress>()
collectValidNetworkInterfaces(interfaceAddresses)
collectBroadcastAddresses(interfaceAddresses)
}
private fun collectValidNetworkInterfaces(interfaceAddresses: ArrayList<InterfaceAddress>) {
NetworkInterface.getNetworkInterfaces().toList()
.filter { validInterface(it) }
.forEach { nInterface -> nInterface.interfaceAddresses.toCollection(interfaceAddresses) }
}
private fun collectBroadcastAddresses(interfaceAddresses: ArrayList<InterfaceAddress>) {
broadcastAddresses = interfaceAddresses
.filter { address -> address.broadcast != null }
.map { it.broadcast }
}
Run Code Online (Sandbox Code Playgroud)
当然它没有编译,因为collectBroadcastAddresses函数试图重新分配broadcastAddresses val.虽然我不想把这个函数的代码放到init块中,因为代码在做什么并不明显,而且函数名称非常好.
在这种情况下我该怎么办?我想保持我的代码干净,这是最重要的一点!
目前我有一个返回Pair<User, User>对象的私有函数.第一个用户是某个东西的发送者,第二个用户是该东西的接收者.
我认为这Pair<User, User>还不够自我解释 - 或者如果你喜欢的话也很干净 - 尽管它只是一个私人功能.
是否可以使用这样的ad-hoc对象返回:
private fun findUsers(instanceWrapper: ExceptionInstanceWrapper): Any {
return object {
val sender = userCrud.findOne(instanceWrapper.fromWho)
val receiver = userCrud.findOne(instanceWrapper.toWho)
}
}
Run Code Online (Sandbox Code Playgroud)
并使用返回值,如下所示:
// ...
val users = findUsers(instanceWrapper)
users.sender // ...
users.receiver // ...
// ...
Run Code Online (Sandbox Code Playgroud)
?
如果没有,Kotlin的临时对象有什么意义?