如果我有一个可空类型Xyz?,我想引用它或将其转换为非可空类型Xyz.在Kotlin这样做的惯用方法是什么?
例如,此代码出错:
val something: Xyz? = createPossiblyNullXyz()
something.foo() // Error: "Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type Xyz?"
Run Code Online (Sandbox Code Playgroud)
但是,如果我首先检查null是允许的,为什么?
val something: Xyz? = createPossiblyNullXyz()
if (something != null) {
something.foo()
}
Run Code Online (Sandbox Code Playgroud)
假设我确定它确实从未如此,如何null在不需要if检查的情况下更改或处理值null?例如,在这里,我从地图中检索一个我可以保证存在的值而结果get()不是null.但是我有一个错误:
val map = mapOf("a" to 65,"b" to 66,"c" to 67)
val something = map.get("a")
something.toLong() // Error: "Only safe (?.) or non-null asserted (!!.) calls …Run Code Online (Sandbox Code Playgroud) 我有一个数组:
var month: List<String> = arrayListOf("January", "February", "March")
Run Code Online (Sandbox Code Playgroud)
我必须过滤列表,所以我只留下"January".
我正在学习Kotlin,看起来我可能希望在明年使用它作为我的主要语言.然而,我不断得到相互矛盾的研究,Kotlin有或没有不可变的集合,我想弄清楚我是否需要使用Google Guava.
有人可以给我一些指导吗?它默认使用不可变集合吗?什么操作符返回可变或不可变的集合?如果没有,是否有计划实施它们?
说我有一个activities类型的变量List<Any>?.如果列表不为空且不为空,我想做某事,否则我想做其他事情.我想出了以下解决方案:
when {
activities != null && !activities.empty -> doSomething
else -> doSomethingElse
}
Run Code Online (Sandbox Code Playgroud)
在Kotlin有更实用的方法吗?
我正在寻找一个与Groovy的collate相当的函数,它将大型List分成批处理.我确实看到subList哪些可以改编成类似的功能,但想检查并确保我没有错过内置或疯狂的简单替代滚动我自己.
如果我想将我的Kotlin集合收集到stdlib中没有内置的东西,我该怎么做?
我写了以下代码:
val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
for (i in src)
{
if (i % 2 == 0) dest.add(Math.sqrt(i.toDouble()))
}
Run Code Online (Sandbox Code Playgroud)
IntellJ(在我的例子中是AndroidStudio)问我是否要用stdlib中的操作替换for循环.这导致以下代码:
val src = (0 until 1000000).toList()
val dest = ArrayList<Double>(src.size / 2 + 1)
src.filter { it % 2 == 0 }
.mapTo(dest) { Math.sqrt(it.toDouble()) }
Run Code Online (Sandbox Code Playgroud)
现在我必须说,我喜欢改变的代码.当我提出类似的情况时,我发现写入比循环更容易.但是在阅读了filter函数的功能后,我意识到与for循环相比,这是一个很慢的代码.filterfunction创建一个新列表,其中仅包含src中与谓词匹配的元素.因此,在stdlib版本的代码中创建了另外一个列表和一个循环.对于小型列表来说,它可能并不重要,但总的来说这听起来不是一个好的选择.特别是如果要连接更多这样的方法,你可以通过编写for循环来获得许多可以避免的额外循环.
我的问题是什么被认为是Kotlin的良好做法.我应该坚持使用循环还是我错过了一些东西而且它不起作用,因为我觉得它有效.
limitJava 8中有一个stream方法:
package com.concretepage.util.stream;
import java.util.Arrays;
import java.util.List;
public class LimitDemo {
public static void main(String[] args) {
List<String> list = Arrays.asList("AA","BB","CC","DD","EE");
list.stream().limit(3).forEach(s->System.out.println(s));
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
AA
BB
CC
Run Code Online (Sandbox Code Playgroud)
Kotlin中的模拟名称是什么,或者如何通过其他方式更好地做到这一点?
假设我有一个人员列表并希望拥有Map<String, Person>,其中String是人名.我应该怎么做kotlin?
kotlin ×10
java-stream ×2
algorithm ×1
collect ×1
collections ×1
filtering ×1
idioms ×1
java ×1
java-8 ×1
list ×1
non-nullable ×1
nullable ×1
sequence ×1