相关疑难解决方法(0)

在Kotlin中,处理可空值,引用或转换它们的惯用方法是什么

如果我有一个可空类型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)

nullable non-nullable kotlin

159
推荐指数
1
解决办法
5万
查看次数

67
推荐指数
1
解决办法
3万
查看次数

如何在Kotlin中过滤ArrayList,以便我只有符合条件的元素?

我有一个数组:

var month: List<String> = arrayListOf("January", "February", "March")
Run Code Online (Sandbox Code Playgroud)

我必须过滤列表,所以我只留下"January".

filtering list kotlin

48
推荐指数
6
解决办法
5万
查看次数

Kotlin和Immutable Collections?

我正在学习Kotlin,看起来我可能希望在明年使用它作为我的主要语言.然而,我不断得到相互矛盾的研究,Kotlin有或没有不可变的集合,我想弄清楚我是否需​​要使用Google Guava.

有人可以给我一些指导吗?它默认使用不可变集合吗?什么操作符返回可变或不可变的集合?如果没有,是否有计划实施它们?

kotlin

37
推荐指数
4
解决办法
1万
查看次数

在Kotlin中处理可空或空列表的惯用方法

说我有一个activities类型的变量List<Any>?.如果列表不为空且不为空,我想做某事,否则我想做其他事情.我想出了以下解决方案:

when {
    activities != null && !activities.empty -> doSomething
    else -> doSomethingElse
}
Run Code Online (Sandbox Code Playgroud)

在Kotlin有更实用的方法吗?

idioms kotlin kotlin-null-safety

26
推荐指数
4
解决办法
2万
查看次数

Kotlin:将大型List转换为set partition size的子列表

我正在寻找一个与Groovy的collat​​e相当的函数,它将大型List分成批处理.我确实看到subList哪些可以改编成类似的功能,但想检查并确保我没有错过内置或疯狂的简单替代滚动我自己.

kotlin

19
推荐指数
2
解决办法
9329
查看次数

什么是Java Stream.collect的Kotlin等价物?

如果我想将我的Kotlin集合收集到stdlib中没有内置的东西,我该怎么做?

collections kotlin

15
推荐指数
2
解决办法
6345
查看次数

Kotlin stdlib operatios vs for循环

我写了以下代码:

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的良好做法.我应该坚持使用循环还是我错过了一些东西而且它不起作用,因为我觉得它有效.

kotlin

15
推荐指数
1
解决办法
2661
查看次数

限制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中的模拟名称是什么,或者如何通过其他方式更好地做到这一点?

java-8 kotlin java-stream

11
推荐指数
1
解决办法
3417
查看次数

Java 8 stream.collect(Collectors.toMap())模拟在kotlin中

假设我有一个人员列表并希望拥有Map<String, Person>,其中String是人名.我应该怎么做kotlin?

java sequence collect kotlin java-stream

7
推荐指数
1
解决办法
2219
查看次数