从官方指南和来自Web的示例中,我没有看到任何锁定或同步的提及,或者在多个launch或async调用中修改共享变量的安全性.
在 Kotlin 中,let如果对象(let接收者)不是null,则执行代码是很常见的,作为if != null检查的替代方法,如下所示:
val nullable: String? = "anything"
nullable?.let {
println(it)
}
Run Code Online (Sandbox Code Playgroud)
在其他什么情况下使用let?
仅供参考,let是 Kotlin 标准库的一部分,定义如下:
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R = block(this)
Run Code Online (Sandbox Code Playgroud) 我正在尝试将一个HashMap元素转换为JSON字符串.我正在使用此链接中使用的方法.
val elementsNew: HashMap<String, Element> = HashMap(elements)
val type = Types.newParameterizedType(Map::class.java, String::class.java, Element::class.java)
var json: String = builder.adapter(type).toJson(elementsNew)
Run Code Online (Sandbox Code Playgroud)
但这会产生以下错误
错误:(236,40)类型推断失败:没有足够的信息来推断有趣适配器中的参数T(p0:Type!):JsonAdapter!请明确说明.
谁能告诉我哪里出错了?是因为Kotlin吗?
假设我有任何课程,比如这个课程:
class SomeClass(val aThing: String, val otherThing: Double)
Run Code Online (Sandbox Code Playgroud)
然后我用反射来分析这个类的字段:
for(field in SomeClass.declaredMemberProperties){
}
Run Code Online (Sandbox Code Playgroud)
如何查看每个字段的类型?
我正在编写一个迭代一个集合的函数,并找到其中最常见的项目.
以下是我到目前为止获取值并添加它们在集合中出现的次数.我将值作为键放在地图中,并将其显示为其值的次数.
fun mostCommon(input: Collection<Int>): Set<Int> {
var newMap: MutableMap<Int, Int> = HashMap()
for (item in input) {
if (newMap.containsKey(item)) {
//TODO: add 1 to value if key is found
}else {
newMap.put(item, 1)
}
}
return emptySet()
}
Run Code Online (Sandbox Code Playgroud)
如果密钥已存在,我无法找到将值加1的方法.
我试过这样做:
newMap[item] +=1
Run Code Online (Sandbox Code Playgroud)
但我得到一个关于plusAssign(1)的错误,不允许在Nullable接收器上.
我想执行XOR来查找两个布尔值a和b中的一个是否为真,但不是两个.在Kotlin中搜索XOR给了我这个答案
infix fun xor(other: Boolean): Boolean在此布尔值与另一个布尔值之间执行逻辑xor运算.资源
我仍然对如何实现这一点感到困惑
假设我有以下Java类:
public class A {
public Result method1(Object o) {...}
public Result method2(Object o) {...}
...
public Result methodN(Object o) {...}
}
Run Code Online (Sandbox Code Playgroud)
然后,在我的Kotlin代码中:
fun myFunction(...) {
val a: A = ...
val parameter = ...
val result = a.method1(parameter) // what if i want methodX?
do more things with result
}
Run Code Online (Sandbox Code Playgroud)
我希望能够选择在里面调用哪个methodX myFunction.在Java中,我会将其A::method7作为参数传递并调用它.在Kotlin它没有编译.我应该如何在Kotlin解决它?
有代码如:
result.also{......}
Run Code Online (Sandbox Code Playgroud)
但是result可能是null并且编译器没有抱怨,它是相同的
null.also{...}
Run Code Online (Sandbox Code Playgroud)
是否确定打电话also{} 的null?
我正在尝试将表单传递给控制器,但对象为空(看起来像从默认构造函数而不是从表单获取值)。而且不知道为什么@Valid不起作用。
码:
终点
@PostMapping("/add")
fun addDevice(@Valid @ModelAttribute device: Device, model: ModelMap): ModelAndView {
deviceRepository.save(device)
return ModelAndView("redirect:/devices/all", model)
}
Run Code Online (Sandbox Code Playgroud)
实体:
@Entity
data class Device(
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Int? = null,
@NotNull
val name: String? = "",
@Min(10)
@Max(30)
val price: Int? = null,
@Size(min = 8)
val secretPhrase: String? = ""
) : Serializable
Run Code Online (Sandbox Code Playgroud)
形成
<h1>Add Device</h1>
<!--/*@thymesVar id="device" type="com.example.demo.Device"*/-->
<form action="#" th:action="@{/devices/add}" th:object="${device}" th:method="post">
<div class="col-md-12">
<label>Name Cannot Be Null</label>
<input type="text" minlength="1" th:field="*{name}"></input>
</div> …Run Code Online (Sandbox Code Playgroud) 继Kotlin for Android Developers本书中,我们遇到的扩展功能
fun <T:Any> SelectQueryBuilder.parseList(parser: (Map<String,Any?>) -> T):List<T> = parseList(object:MapRowParser<T>{
override fun parseRow(columns: Map<String, Any?>): T = parser(columns)
})
Run Code Online (Sandbox Code Playgroud)
而且我不确定为什么这:Any是必要的。
如果我把它写成fun <T> SelectQueryBuilder.parseList(...),Android Studio 会抱怨
而当您添加:Any后,该错误就会消失。
现在,就我而言,T应该暗示T:Any,尽管显然情况并非如此。这是为什么?它有什么区别?