Kotlin中获取Int类型ArrayList的最大值
解决Kotlin集合
max()返回可空类型的更优方案 嘿,这个问题我之前也碰到过!既然你明确知道你的amplititudes集合是有元素的(手动添加了7个Int值),那有几个比单纯用?.更优雅的方案,既能避免冗余的空安全处理,又能保证代码的安全性:
方案1:使用requireNotNull()强制解包(推荐)
这个方法会在值为null时抛出带自定义信息的异常,非常适合你这种100%确定集合非空的场景——既符合fail-fast的编程原则,又能让代码意图更清晰:
var amplititudes: ArrayList<Int> = ArrayList() amplititudes.add(1) amplititudes.add(2) amplititudes.add(3) amplititudes.add(4) amplititudes.add(3) amplititudes.add(2) amplititudes.add(1) val maxAmplitude = requireNotNull(amplititudes.max()) { "振幅集合不能为空,无法获取最大值" } // 此时maxAmplitude的类型是Int,而非Int?
如果未来代码不小心导致集合为空,这个方法会立刻抛出异常,帮你快速定位问题,比默默使用!!强制解包更安全。
方案2:结合!!强制解包(不推荐,除非绝对确定)
如果你完全确信集合不可能为空,也可以直接用!!强制解包,但这种方式风险较高——一旦集合意外为空,会直接抛出空指针异常,不利于调试:
val maxAmplitude = amplititudes.max()!!
只建议在你能保证集合永远非空的极端场景下使用。
方案3:自定义非空集合类型(进阶)
如果你经常需要处理这类确定非空的集合,可以利用Kotlin的类型系统,将集合标记为非空类型(需要Kotlin 1.3+):
import kotlin.collections.NotEmptyCollection val nonEmptyAmplitudes = amplititudes as Collection<Int> & NotEmptyCollection val maxAmplitude = nonEmptyAmplitudes.max() // 此时max()返回的是Int,而非Int?
不过这种方式稍显繁琐,适合在大型项目中统一规范非空集合的场景。
额外提示:如果集合可能为空的场景
如果未来你的集合存在为空的可能性,那更优雅的方式是结合空合并运算符?:设置默认值,比如:
val maxAmplitude = amplititudes.max() ?: 0 // 当集合为空时返回0
内容的提问来源于stack exchange,提问作者Dishonered
相关产品推荐
相关产品推荐

