1.Kotlin初始化一个数组
val number:IntArray = intArrayOf(10,20,30)
2.fold 和reduce 区别
在 Kotlin 中,fold和reduce都是用于对集合进行聚合操作的函数,它们的基本区别如下:
一、语法和参数
fold函数的语法为:fold(initial: R, operation: (acc: R, T) -> R): R。它接收一个初始值initial和一个函数operation,函数接收一个累加器(初始值类型为R)和集合中的元素(类型为集合元素类型T),并返回一个新的累加器值。最终返回的结果类型也是R。
reduce函数的语法为:reduce(operation: (T, T) -> T)。它接收一个函数operation,函数接收两个集合中的元素(类型为集合元素类型T),并返回一个新的元素值。最终返回的结果类型是集合元素类型T。
二、是否需要初始值
fold必须提供一个初始值,这个初始值在整个聚合过程的开始就被使用,并且决定了最终结果的类型。
reduce在处理一些集合时可能不需要初始值,但如果集合为空,会抛出异常。对于不可变集合,如果没有初始值,它会使用集合的第一个元素作为初始值进行聚合操作。
三、使用场景举例
1.使用fold:
假设我们有一个整数列表,想要计算列表中所有元素的总和,可以使用fold如下:
val list = listOf(1, 2, 3, 4, 5)
val sum = list.fold(0) { acc, element -> acc + element }
println(sum) // 15
在这个例子中,初始值为 0,每次迭代将累加器和列表中的元素相加,最终得到列表元素的总和。
2.使用reduce:
同样对于计算整数列表中所有元素的总和,如果确定列表不为空,可以使用reduce:
val list = listOf(1, 2, 3, 4, 5)
val sum = list.reduce { a, b -> a + b }
println(sum) // 15
这里直接对列表中的两个元素进行操作,逐步将结果累加到最终的总和。
综上所述,fold和reduce在 Kotlin 中都是强大的聚合操作函数,但在使用时需要根据具体情况选择合适的函数。如果需要一个初始值来确保结果的类型或者处理空集合的情况,fold是更好的选择。如果集合不为空且不需要初始值,reduce可以提供更简洁的语法。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/challenge51all/article/details/141933329
3.var与val的区别
1. val(value):
val 声明的变量是不可变的(immutable),一旦初始化后,其值不能被修改。
通常情况下,应优先使用 val,因为不可变性有助于代码的安全性和可维护性。
常用于声明常量、不会改变的配置、函数返回值等。
val pi = 3.14
val message = "Hello, Scala!"
2. var(variable):
var 声明的变量是可变的(mutable),可以重新赋值。
在需要变化的情况下使用 var,比如循环中的计数器、需要动态更新的状态等。
不可变性是函数式编程的重要概念,但在一些情况下,可变性是必要的,比如在某些算法中需要不断更新状态。
var counter = 0
counter = counter + 1
一般来说,尽量使用 val 来声明变量,因为它有利于代码的健壮性和可读性。只有在确实需要可变性的情况下才使用 var。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/2401_87076475/article/details/141815723
4.kotlin在哪里使用var和where val
作为类型约束(在泛型中)
在 Kotlin 的泛型编程中,where 子句可以用来指定类型约束。在这种情况下,你可以使用 var 或 val 来指定一个类型参数是否应该被视为可变引用(即,其引用可以被改变,但引用的对象本身不变)或不可变引用(即,引用的对象不能被替换)。
5.kotlin 的数据类
Kotlin 基本数据类型
Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。
不同于 Java 的是,字符不属于数值类型,是一个独立的数据类型。
整数类型
- Byte: 8 位,范围从 -128 到 127。
- Short: 16 位,范围从 -32,768 到 32,767。
- Int: 32 位,范围从 -2^31 到 2^31 - 1。
- Long: 64 位,范围从 -2^63 到 2^63 - 1。
浮点数类型
- Float: 32 位,单精度,带有 6-7 位有效数字。
- Double: 64 位,双精度,带有 15-16 位有效数字。
字符类型
- Char: 16 位的 Unicode 字符。
布尔类型
- Boolean: 有两个值:
true和false。
字符串类型
- String: 一系列字符的序列。
数组类型
Kotlin 提供了数组类型来存储同种类型的元素,例如:
- IntArray: 存储
Int类型的数组。 - DoubleArray: 存储
Double类型的数组。 - Array<T>: 泛型数组,可以存储任意类型。
6.kotlin 单例怎么创建
一、对象表达式
可以使用对象表达式来创建单例。这种方式非常简洁,直接在需要的地方定义一个对象即可。
object Singleton {
fun doSomething() {
println("Singleton is doing something.")
}
}
使用时直接通过对象名调用方法:
Singleton.doSomething()
二、伴生对象实现单例
在一个类中,可以使用伴生对象来创建类似于单例的行为。伴生对象在类加载时被创建,并且在整个应用程序中只有一个实例。
class SingletonClass {
companion object {
val instance: SingletonClass by lazy { SingletonClass() }
}
}
使用时可以通过类名和伴生对象的名称来访问单例实例:
SingletonClass.instance.doSomething()
三、使用委托实现单例
可以使用委托属性来实现单例模式。这种方式可以将单例的创建和管理委托给另一个对象。
class SingletonDelegate private constructor() {
fun doSomething() {
println("SingletonDelegate is doing something.")
}
companion object {
val instance by lazy(LazyThreadSafetyMode.SYNCHRONIZED) { SingletonDelegate() }
}
}
object SingletonByDelegate {
val singleton by lazy { SingletonDelegate.instance }
}
使用时通过委托对象来调用方法:
SingletonByDelegate.singleton.doSomething()
四、单例的优势和注意事项
优势:
全局只有一个实例,节省内存资源,特别是在需要频繁创建和销毁对象的情况下。
方便管理全局状态,例如配置信息、数据库连接等。
注意事项:
单例可能会导致代码的可测试性降低,因为很难模拟单例对象的行为。在测试时,可以考虑使用依赖注入等技术来解决这个问题。
过度使用单例可能会导致代码的耦合度增加,不利于代码的维护和扩展。应该根据实际情况合理使用单例模式。
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.youkuaiyun.com/challenge51all/article/details/141939406
5.kotlin 伴生对象的用途
Kotlin 伴生对象(Companion Object)是一种特殊的类成员,它允许你在不创建类实例的情况下访问类的静态方法和属性。伴生对象在 Kotlin 中非常有用,因为它们提供了一种简洁的方式来组织和使用静态方法和属性。以下是 Kotlin 伴生对象可以执行的一些操作:
- 定义静态方法和属性:伴生对象允许你在类中定义静态方法和属性,这样你就可以在不创建类实例的情况下访问它们。
class MyClass {
companion object {
const val MY_CONSTANT = "Hello, World!"
fun myStaticFunction() {
println("This is a static function.")
}
}
}
- 使用伴生对象进行工厂方法:你可以使用伴生对象来实现工厂方法,这样可以在不暴露构造函数的情况下创建类的实例。
class MyClass {
companion object {
fun createInstance(param: String): MyClass {
return MyClass(param)
}
}
constructor(param: String) {
println("Creating instance with parameter: $param")
}
}
- 实现单例模式:通过伴生对象,你可以轻松地实现单例模式,确保一个类只有一个实例。
class Singleton {
companion object {
private var instance: Singleton? = null
fun getInstance(): Singleton {
return instance ?: synchronized(this) {
instance ?: Singleton().also { instance = it }
}
}
}
}
复制代码
- 使用伴生对象进行扩展:你可以使用伴生对象为现有类添加新的功能,而无需继承该类或使用其他设计模式。
fun String.myExtensionFunction() {
println("This is an extension function for String.")
}
class MyClass {
companion object {
fun printMyExtensionFunction() {
"Hello, World!".myExtensionFunction()
}
}
}
总之,Kotlin 伴生对象提供了一种简洁、高效的方式来组织和使用静态方法和属性,使你的代码更加模块化和易于维护。
6.lateinit 延迟初始化 ( ::属性名称.isInitialized 检查属性是否初始化 )
在定义属性时 , 可以使用 lateinit 关键字 设置该属性的 延迟初始化 , 在 实例对象 创建时不进行初始化 , 在使用该属性之前对其进行初始化即可 ;
对于 lateinit 延迟初始化 的属性 , 在使用前可以执行
代码语言:javascript
复制
::属性名称.isInitialized
检查 , 查看该属性是否进行了初始化操作 ;
代码示例 :
代码语言:javascript
复制
class Hello{
lateinit var name: String
fun logName() {
if(::name.isInitialized) {
println("name 属性值为 $name")
} else {
println("name 属性没有进行初始化操作")
}
}
}
fun main() {
var hello = Hello()
hello.logName()
hello.name = "Tom"
hello.logName()
}
执行结果 :
代码语言:javascript
复制
name 属性没有进行初始化操作
name 属性值为 Tom
2万+

被折叠的 条评论
为什么被折叠?



