Kotlin语法手册(一)
Kotlin语法手册(一)
在使用kotlin时,由于掌握的不够牢靠,好多时候也还是Java编程的习惯,浪费了kotlin提供的语言特性,方便性,间接性,在阅读一些Android开源库的时候,由于好多都是kotlin语法编写的,看的比较费劲,还得去查阅kotlin的语法,比较不方便,故把kotlin的语法记录下来,方便查阅温故,巩固自己的基础知识。
变量
kotlin 中,变量分为 可变变量(var) 和 不可变变量(val) 两类。
- val:不可变引用,对应的是 Java 中的 final 变量;使用 val 声明的变量不能在初始化之后再次赋值。
- var:可变引用,对应的是 Java 中的非 final 变量;使用 var 声明的变量的值可以被改变。
不可变变量在赋值之后就不能再去改变它的状态了,因此不可变变量可以说是线程安全的,因为它们无法改变,所有线程访问到的对象都是同一个,因此也不需要去做访问控制。开发者应当尽可能地使用不可变变量,这样可以让代码更加接近函数式编程风格。
fun main() {//声明一个整数类型的不可变变量,初始化后intValue的值不能再改变了val intValue: Int = 100//声明一个双精度类型的可变变量var doubleValue: Double = 100.0
}
在声明变量时,通常不需要显式指明变量的类型,可以由编译器根据上下文自动推导出来。如果只读变量在声明时没有初始的默认值,则必须指明变量类型,且在使用前必须确保在各个分支条件下变量可以被初始化,否则编译器就会报异常。
数据类型
基本数据类型
在 kotlin中,一切都是对象,可以在任何变量上调用其成员函数和属性,并不区分基本数据类型和它的包装类。也就是说kotlin 没有像 Java 中那样的原始基本类型,但 byte、char、integer、float 或者 boolean 等类型仍然有保留,但是全部都作为对象存在。
//在 kotlin 中,int、long、float 等类型仍然存在,但是是作为对象存在的val intIndex: Int = 100//等价于,编译器会自动进行类型推导val intIndex = 100//数字类型不会自动转型,必须要进行明确的类型转换val doubleIndex: Double = intIndex.toDouble()//以下代码会提示错误,需要进行明确的类型转换//val doubleIndex: Double = intIndexval intValue: Int = 1val longValue: Long = 1//以下代码会提示错误,因为两者的数据类型不一致,需要转换为同一类型后才能进行比较//println(intValue == longValue)//Char 不能直接作为数字来处理,需要主动转换val ch: Char = 'c'val charValue: Int = ch.toInt()//以下代码会提示错误//val charValue: Int = ch//不支持八进制//二进制val value1 = 0b00101//十六进制val value2 = 0x123
字符串
字符串用 String
类型表示。字符串是不可变的。字符串的元素:使用索引运算符访问: s[i]
;可以用 for 循环迭代字符串,也可以用 + 来连接字符串。
val str = "hello"println(str[1])for (c in str) {println(c)}val str1 = str + " world"
kotlin 支持在字符串字面值中引用局部变量,只需要在变量名前加上字符 $ 即可,此外还可以包含用花括号{}括起来的表达式,此时会自动求值并把结果合并到字符串中。
val intValue = 100//可以直接包含变量println("intValue value is $intValue") //intValue value is 100//也可以包含表达式println("(intValue + 100) value is ${intValue + 100}") //(intValue + 100) value is 200
如果你需要在原始字符串中表示字面值($)字符(它不支持反斜杠转义),可以用下列语法:
val price = "${'$'}100.99"println(price) //$100.99
数组
数组在 Kotlin 中使用 Array
类来表示,它定义了 get
与 set
函数(按照运算符重载约定这会转变为 []
)以及 size
属性,以及一些其他有用的成员函数:
- arrayOf():使用库函数 arrayOf() 来创建一个数组并传递元素值给它,如:
arrayOf(1, 2, 3)
就创建了[1, 2, 3]
。 - arrayOfNulls:库函数
arrayOfNulls()
可以用于创建一个指定大小的、初始化所有元素都为空的数组。 - Array:Array是接受数组大小以及一个函数参数的构造函数,用作参数的函数能够返回给定索引的每个元素初始值,如下所示:
// 创建一个 Array<String> 数组大小为5,函数为(i * i).toString()的字符串数组
val asc = Array(5) { i -> (i * i).toString() }//["0", "1", "4", "9", "16"]
asc.forEach { println(it) }
基本数据类型数组
数组类型的类型参数如上面的Array,始终会变成对象类型,因此声明 Array< Int > 将是一个包含装箱类型(java.lang.Integer)的数组,如果想要创建没有装箱的基本数据类型的数组,必须使用一个基本数据类型数组的特殊类IntArray、ByteArray、BooleanArray 等,这些类与 Array
并没有继承关系,但是它们有同样的方法属性集,它们也都有相应的工厂方法。
val x: IntArray = intArrayOf(1, 2, 3)
x[0] = x[1] + x[2]
// 大小为 5、值为 [0, 0, 0, 0, 0] 的整型数组
val arr = IntArray(5)// 例如:用常量初始化数组中的值
// 大小为 5、值为 [42, 42, 42, 42, 42] 的整型数组
val arr = IntArray(5) { 42 }// 例如:使用 lambda 表达式初始化数组中的值
// 大小为 5、值为 [0, 1, 2, 3, 4] 的整型数组(值初始化为其索引值)
var arr = IntArray(5) { it * 1 }
集合
kotlin中集合分为只读集合与可变集合,如下所示:
集合元素 | 只读 | 可变 |
---|---|---|
List | listOf | mutableListOf、arrayListOf |
Set | setOf | mutableSetOf、hashSetOf、linkedSetOf、sortedSetOf |
Map | mapOf | mutableMapOf、hashMapOf、linkedMapOf、sortedMapOf |
- List是一个有序集合,可通过索引访问元素。元素可以在 list 中出现多次。
- Set是唯一元素的集合,一组无重复的对象。一般来说 set 中元素的顺序并不重要。例如,字母表是字母的集合(set)。
- Map是一组键值对。键是唯一的,每个键都刚好映射到一个值。值可以重复
只读集合的可变性
只读集合不一定就是不可变的。例如,假设存在一个拥有只读类型接口的对象,该对象存在两个不同的引用,一个只读,一个可变,当可变引用修改了该对象后,这对只读引用来说就相当于“只读集合被修改了”,因此只读集合并不总是线程安全的。如果需要在多线程环境下处理数据,需要保证正确地同步了对数据的访问,或者使用支持并发访问的数据结构
例如,list1 和 list1 引用到同一个集合对象, list3 对集合的修改同时会影响到 list1
val list1: List<String> = JavaMain.namesval list3: MutableList<String> = JavaMain.nameslist1.forEach { it -> println(it) } //leavesC Yelist3.forEach { it -> println(it) } //leavesC Yefor (index in list3.indices) {list3[index] = list3[index].toUpperCase()}list1.forEach { it -> println(it) } //LEAVESC YE
集合与可空性
集合的可空性可以分为三种:
- 可以包含为 null 的集合元素
- 集合本身可以为 null
- 集合本身可以为 null,且可以包含为 null 的集合元素
例如,intList1 可以包含为 null 的集合元素,但集合本身不能指向 null;intList2 不可以包含为 null 的集合元素,但集合本身可以指向 null;intList3 可以包含为 null 的集合元素,且集合本身能指向 null
//List<Int?> 是能持有 Int? 类型值的列表val intList1: List<Int?> = listOf(10, 20, 30, 40, null)//List<Int>? 是可以为 null 的列表var intList2: List<Int>? = listOf(10, 20, 30, 40)intList2 = null//List<Int?>? 是可以为 null 的列表,且能持有 Int? 类型值var intList3: List<Int?>? = listOf(10, 20, 30, 40, null)intList3 = null
其他数据类型
- Any:Any 类型是 kotlin 所有非空类型的超类型,包括像 Int 这样的基本数据类型,如果把基本数据类型的值赋给 Any 类型的变量,则会自动装箱为
java.lang.Integer
的。 - Any?:Any?类型是 kotlin 所有可空类型的超类型,如果想要使变量可以存储包括 null 在内的所有可能的值,则需要使用 Any?
- Unit:Unit 类型类似于 Java 中的 void,可以用于函数没有返回值时的情况,如果函数返回值为 Unit,则可以省略该声明,Unit也可以作为类型参数来声明变量。
- Nothing:Nothing 类型没有任何值,只有被当做函数返回值使用,或者被当做泛型函数返回值的类型参数使用时才会有意义
函数
kotlin 中的函数以关键字 fun 作为开头,函数名称紧随其后,再之后是用括号包裹起来的参数列表,如果函数有返回值,则再加上返回值类型,用一个冒号与参数列表隔开。
//fun 用于表示声明一个函数,double 是函数名,x表示传入参数,Int 表示函数的返回值类型是int型
fun double(x: Int): Int {return 2 * x
}
还有一种是表达式函数体,它是用单行表达式与等号定义的函数,表达式函数体的返回值类型可以省略,返回值类型可以自动推断的。如:fun double(x: Int) = x * 2
如果函数没有有意义的返回值,则可以声明为 Unit ,也可以省略 Unit,下面的三种写法是等价的:
fun test(str: String, int: Int): Unit {println(str.length + int)}fun test(str: String, int: Int) {println(str.length + int)}fun test(str: String, int: Int) = println(str.length + int)
函数的参数
命名参数
kotlin 允许我们使用命名参数,即在调用某函数的时候,可以将函数参数名一起标明,从而明确地表达该参数的含义与作用,但是在指定了一个参数的名称后,之后的所有参数都需要标明名称。如下所示:
fun main() {//该写法是错误的,在指定了一个参数的名称后,之后的所有参数都需要标明名称compute(index = 110, "hello")compute(index = 120, value = "hello")compute(130, value = "hello")
}fun compute(index: Int, value: String) {}
默认参数
函数参数可以有默认值,当省略相应的参数时使用默认值。与其他语言相比,这可以减少重载数量。
fun main() {compute(24)compute(24, "world")
}fun compute(age: Int, name: String = "hello") {}
有默认参数时,可以省略的只有排在末尾的参数,其他位置的是不能省略的,如下所示:
fun main() {//错误,不能省略参数 name// compute(24)// compute(24,100)//可以省略参数 valuecompute("hello", 24)
}fun compute(name: String = "hello", age: Int, value: Int = 100) {}
但是,如果使用命名参数,可以省略任何有默认值的参数,而且也可以按照任意顺序传入需要的参数。
fun main() {compute(age = 24)compute(age = 24, name = "hello")compute(age = 24, value = 90, name = "hello")compute(value = 90, age = 24, name = "hello")
}fun compute(name: String = "hello", age: Int, value: Int = 100) {}
可变参数
kotlin 的语法与 Java 有所不同,可变参数改为通过使用 varage 关键字声明
fun main() {compute()compute("hello")compute("hello", "world")compute("hello", "world", "kotlin")
}fun compute(vararg name: String) {name.forEach { println(it) }
}
在 Java 中,可以直接将数组传递给可变参数,而 kotlin 要求显式地解包数组,以便每个数组元素在函数中能够作为单独的参数来调用,这个功能被称为展开运算符,使用方式就是在数组参数前加一个 *
fun main() {val names = arrayOf("hello", "world", "kotlin")compute(* names)
}fun compute(vararg name: String) {name.forEach { println(it) }
}
局部函数
在Kotlin中,支持在函数中嵌套函数,被嵌套的函数称为局部函数
fun compute(name: String, country: String) {fun check(string: String) {if (string.isEmpty()) {throw IllegalArgumentException("参数错误")}}check(name)check(country)
}
check方法体是放在compute方法体中,check方法被称为局部方法或局部函数;check只能在compute中方法调用,在compute方法外调用,会引起编译错误。
控制流
IF表达式
在 Kotlin 中,if是一个表达式,即它会返回一个值。 因此就不需要三元运算符(条件 ? 然后 : 否则),因为普通的 if 就能胜任这个角色,故kotlin中没有三元运算符。
// 传统用法
var max = a
if (a < b) max = b// With else
var max: Int
if (a > b) {max = a
} else {max = b
}// 作为表达式
val max = if (a > b) a else b
if 的分支可以是代码块,最后的表达式作为该块的值
//a,b就是该块儿最后返回的值
val max = if (a > b) {print("Choose a")a
} else {print("Choose b")b
}
如果你使用 if 作为表达式而不是语句(例如:返回它的值或者把它赋给变量),该表达式需要有 else
分支
when表达式
when 表达式与 Java 中的 switch/case 类似,但功能更为强大。when 既可以被当做表达式使用也可以被当做语句使用,when 将参数和所有的分支条件顺序比较直到某个分支满足条件,然后它会运行右边的表达式。
如果 when 被当做表达式来使用,符合条件的分支的值就是整个表达式的值。与 Java 的 switch/case 不同之处是 when 表达式的参数可以是任何类型,并且分支也可以是一个条件。
和 if 一样,when 表达式每一个分支可以是一个代码块,它的值是代码块中最后的表达式的值,如果其它分支都不满足条件将会求值于 else 分支。
如果 when 作为一个表达式使用,则必须有 else 分支, 除非编译器能够检测出所有的可能情况都已经覆盖了。如果很多分支需要用相同的方式处理,则可以把多个分支条件放在一起,用逗号分隔。
val value = 2when (value) {in 4..9 -> println("in 4..9") //区间判断3 -> println("value is 3") //相等性判断2, 6 -> println("value is 2 or 6") //多值相等性判断is Int -> println("is Int") //类型判断else -> println("else") //如果以上条件都不满足,则执行 else}
fun main() {//返回 when 表达式fun parser(obj: Any): String =when (obj) {1 -> "value is 1""4" -> "value is string 4"is Long -> "value type is long"else -> "unknown"}
}
when 语句也可以不带参数来使用
when {1 > 5 -> println("1 > 5")3 > 1 -> println("3 > 1")}
For循坏
//和java中使用方式很类似val list = listOf(1, 4, 10, 34, 10)for (value in list) {println(value)}
通过索引来遍历
val items = listOf("H", "e", "l", "l", "o")//通过索引来遍历Listfor (index in items.indices) {println("${index}对应的值是:${items[index]}")}
也可以在每次循环中获取当前索引和相应的值
val list = listOf(1, 4, 10, 34, 10)for ((index, value) in list.withIndex()) {println("index : $index , value :$value")}
也可以自定义循环区间
for (index in 2..10) {println(index)}
while循环和do/while循环
两者的使用和Java中的使用相似。
val list = listOf(1, 4, 15, 2, 4, 10, 0, 9)var index = 0while (index < list.size) {println(list[index])index++}
val list = listOf(1, 4, 15, 2, 4, 10, 0, 9)var index = 0do {println(list[index])index++} while (index < list.size)
返回与跳转
Kotlin 有三种结构化跳转表达式(作用和java语言中的类似):
- return 默认从最直接包围它的函数或者匿名函数返回
- break 终止最直接包围它的循环
- continue 继续下一次最直接包围它的循环
在 kotlin 中任何表达式都可以用标签(label)来标记,标签的格式为标识符后跟 @ 符号,例如:abc@ 、fooBar@ 都是有效的标签
fun main() {fun1()
}fun fun1() {val list = listOf(1, 4, 6, 8, 12, 23, 40)loop@ for (it in list) {if (it == 8) {continue}//当值是23的时候,退出标记的loop循环if (it == 23) {break@loop}println("value is $it")}println("function end")
}
通常情况下使用隐式标签更方便, 隐式标签与接受该 lambda 的函数同名,return也可添加标签限制(如下:)
fun fun3() {val list = listOf(1, 4, 6, 8, 12, 23, 40)list.forEach {if (it == 8) {//这是就是在return上加了隐式标签forEach的限制,使之只在forEach当前循环中终止返回,效果同continuereturn@forEach}println("value is $it")}println("function end")//运行fun3方法的话,会输出以下结果:
// value is 1
// value is 4
// value is 6
// value is 12
// value is 23
// value is 40
// function end
}fun fun4() {val list = listOf(1, 4, 6, 8, 12, 23, 40)list.forEach loop@{if (it == 8) {return@loop//同fun3一样,这里是添加了loop的标签显式标签}println("value is $it")}println("function end")
//运行fun4方法的话,会输出以下结果:
// value is 1
// value is 4
// value is 6
// value is 12
// value is 23
// value is 40
// function end
}fun fun5() {listOf(1, 2, 3, 4, 5).forEach(fun(value: Int) {if (value == 3) {//局部返回到匿名函数的调用者,即 forEach 循环return}println("value is $value")})println("function end")
}
//运行fun5方法的话,会输出以下结果:
//value is 1
//value is 2
//value is 4
//value is 5
//function end
区间
Kotlin 可通过调用 kotlin.ranges
包中的 [rangeTo()
] 函数及其操作符 ..
形式的轻松地创建两个值的区间。 通常,rangeTo()
会辅以 in
或 !in
函数
if (i in 1..4) { // 等同于 i>=1 && i <= 4print(i)
}if (i in 1.rangeTo(4)) { // 和上面是相同的print(i)
}
数字类型的 ranges 在被迭代时,等同于java中带索引的fori的循环的效果
for (i in 1..4) {print(i)
}
要反向迭代数字,请使用 [downTo
]函数而不是 ..
或rangeTo(
)。
for (i in 4 downTo 1) print(i)
这是通过 [step
]函数完成任意步长(不一定为 1 )迭代数字
for (i in 1..8 step 2) print(i)
println()
for (i in 8 downTo 1 step 2) print(i)
以上声明的都是闭区间,如果想声明的是开区间),可以使用 until 函数
for (i in 1 until 4) {println(i)
}
空安全
在 kotlin 中,类型系统将一个引用分为可以容纳 null (可空引用)或者不能容纳 null(非空引用)两种类型。 常规的变量不能指向null,如果希望一个变量可以储存 null 引用,需要显式地在类型名称后面加上问号?
。
//name变量不能被赋值为nullvar name: String = "hello"//name变量可以被赋值为nullvar name: String? = "hello"
kotlin 对可空类型的显式支持有助于防止 NullPointerException 导致的异常问题,编译器不允许不对可空变量做 null 检查就直接调用其属性。
var name: String? = "hello"val l = name.length // 编译器会报错,因为name变量可能为null
在写代码的时候,我们可以对可空的变量做判空判断,kotlin也为我们提供了安全的调用的运算符
安全的调用
?.
:如果变量值非空,则变量的方法或属性会被调用,否则直接返回 null。
//b变量声明的是可空类型的,当b!=null的时候,就返回的b.length的值
//当b=null时,b?.length就自动返回的null,可以看出这个表达式返回的类型是Int?
println(b?.length)
安全调用在链式调用中也很有用,例如,如果一个员工 Bob 可能会(或者不会)分配给一个部门, 并且可能有另外一个员工是该部门的负责人,那么获取 Bob 所在部门负责人(如果有的话)的名字,我们写作:bob?.department?.head?.name
如果任意一个属性(环节)为空,这个链式调用就会返回 null。
如果要只对非空值执行某个操作,安全调用操作符可以与 [let
] 一起使用:
val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {item?.let { println(it) } // 输出 Kotlin 并忽略 null
}
安全调用也可以出现在赋值的左侧。这样,如果调用链中的任何一个接收者为空都会跳过赋值,而右侧的表达式根本不会求值:
// 如果 `person` 或者 `person.department` 其中之一为空,都不会调用该函数:
person?.department?.head = managersPool.getManager()
Elvis 操作符
当我们有一个可空的引用 b
时,如果 b
非空,我使用它;如果使用 b
是空的话,我们想使用某个非空的值,如下所示:
val l: Int = if (b != null) b.length else -1
除了可以用if表达式,这还可以通过 Elvis 操作符表达,写作 ?:
//当表达式b?.length为空(即b=null)的时候赋值为-1
val l = b?.length ?: -1
如果 ?:
左侧表达式非空,elvis 操作符就返回其左侧表达式,否则返回右侧表达式。 请注意,当且仅当左侧为空时,才会对右侧表达式求值。
安全的类型转换
如果对象不是目标类型,那么常规类型转换可能会导致 ClassCastException
。 另一个选择是使用安全的类型转换as?
,如果尝试转换不成功则返回 null:
//如果a不是Int类型的话,会返回null
val aInt: Int? = a as? Int
非空断言运算符!!
!!
是将任何值转换为非空类型,若该值为空则抛出异常
//如果b=null,会抛出空指针NPE异常
val l = b!!.length
可空类型的扩展
为可空类型定义扩展函数是一种更强大的处理 null 值的方式,可以允许接收者为 null 的调用,并在该函数中处理 null ,而不是在确保变量不为 null 之后再调用它的方法
//可以被正常调用而不会发生空指针异常val name: String? = nullprintln(name.isNullOrEmpty()) //true
类型检测与类型转换
类型检查is
与 !is
操作符
在运行时通过使用 is
操作符或其否定形式 !is
来检测对象是否符合给定类型
if (obj is String) {print(obj.length)
}if (obj !is String) { // 与 !(obj is String) 相同print("Not a String")
}
else {print(obj.length)
}
智能转换
在许多情况下,不需要在 Kotlin 中使用显式转换操作符,因为编译器跟踪不可变值的 is
-检测以及[显式转换],在需要时自动插入(安全的)转换:
fun demo(x: Any) {if (x is String) {print(x.length) // x 自动转换为字符串}
}if (x !is String) return
print(x.length) // x 自动转换为字符串// `||` 右侧的 x 自动转换为字符串
if (x !is String || x.length == 0) return// `&&` 右侧的 x 自动转换为字符串
if (x is String && x.length > 0) {print(x.length) // x 自动转换为字符串
}//用在when表达式和while循环也是一样
when (x) {is Int -> print(x + 1)is String -> print(x.length + 1)is IntArray -> print(x.sum())
}
不安全转换操作符
如果转换是不可能的,转换操作符会抛出一个异常,因此,它是不安全的。 Kotlin 中的不安全转换由操作符 as完成;可空类型和不可空类型是不同的类型,不能转换,比如:String
和String?
是不同的类型。
安全转换操作符
为了避免抛出异常,可以使用安全转换操作符 as? ,它可以在失败时返回 null:
//as?右边是非空类型的,声明是可空类型的,若用as就会抛出异常,这里使用as?可以返回null,所以结果是可空的
val x: String? = y as? String
作用域函数
kotlin标准库包含几个函数,它们的唯一目的是在对象的上下文中执行代码块。当对一个对象调用这样的函数并提供一个lambda表达式时,他会形成一个临时作用域。在此作用域中,可以访问该对象而无需其名称,这些函数称为作用域函数
这些函数基本上做了同样的事情:在一个对象上执行一个代码块。不同的是这个对象在块中如何使用,以及整个表达式的结果是什么。
下面是作用域函数的典型用法:
Person("Alice", 20, "Amsterdam").let {println(it)it.moveTo("London")it.incrementAge()println(it)
}
如果不使用 let
来写这段代码,就必须引入一个新变量,并在每次使用它时重复其名称。
val alice = Person("Alice", 20, "Amsterdam")
println(alice)
alice.moveTo("London")
alice.incrementAge()
println(alice)
作用域函数没有引入任何新的技术,但是它们可以使你的代码更加简洁易读。
区别
标准库中提供了几个作用域函数,他们本质上都非常相似,每个作用域函数之间有两个主要区别:
- 引用上下文对象的方式
- 返回值
上下文对象:this还是it
this
this关键字可看作为lambda 表达式的的接收着。run
、with
以及 apply
通过关键字 this
引用上下文对象,在它们的 lambda 表达式中可以像在普通的类函数中一样访问上下文对象。在大多数场景,当你访问接收者对象时你可以省略 this
,来让你的代码更简短。
val adam = Person("Adam").apply { age = 20 // 和 this.age = 20 或者 adam.age = 20 一样city = "London"
}
println(adam)
it
it关键字可看作为作为 lambda 表达式的参数。例如let
及 also
将上下文对象作为 lambda 表达式参数,如果没有指定参数名,对象可以用隐式默认名称 it
访问
fun getRandomInt(): Int {return Random.nextInt(100).also {writeToLog("getRandomInt() generated value $it")}
}val i = getRandomInt()
此外,当将上下文对象作为参数传递时,可以为上下文对象指定在作用域内的自定义名称。
fun getRandomInt(): Int {//自定义名称valuereturn Random.nextInt(100).also { value ->writeToLog("getRandomInt() generated value $value")}
}val i = getRandomInt()
返回值
根据返回结果,作用域函数可以分为以下两类:
apply
及also
返回上下文对象。let
、run
及with
返回 lambda 表达式结果.
返回上下文对象
apply
及 also
的返回值是上下文对象本身。
val numberList = mutableListOf<Double>()//返回的是对象,可以链式调用
numberList.also { println("Populating the list") }.apply {add(2.71)add(3.14)add(1.0)}.also { println("Sorting the list") }.sort()
当然,也还可以用在返回上下文对象的函数的 return 语句中
fun getRandomInt(): Int {return Random.nextInt(100).also {writeToLog("getRandomInt() generated value $it")}
}val i = getRandomInt()
返回表达式结果
let
、run
及 with
返回 lambda 表达式的结果
val numbers = mutableListOf("one", "two", "three")
val countEndsWithE = numbers.run { add("four")add("five")count { it.endsWith("e") }//返回的结果
}
//There are 3 elements that end with e.
println("There are $countEndsWithE elements that end with e.")
此外,还可以忽略返回值,仅使用作用域函数为变量创建一个临时作用域。
val numbers = mutableListOf("one", "two", "three")
with(numbers) {val firstItem = first()val lastItem = last() println("First item: $firstItem, last item: $lastItem")
}
函数选择
前文提到了几个函数,那么怎么选择合适的作用域函数呢?,下面是列举了它们之间的主要区别表
函数 | 对象引用 | 返回值 | 是否是扩展函数 |
---|---|---|---|
let | it | Lambda 表达式结果 | 是 |
run | this | Lambda 表达式结果 | 是 |
run | - | Lambda 表达式结果 | 不是:调用无需上下文对象 |
with | this | Lambda 表达式结果 | 不是:把上下文对象当做参数 |
apply | this | 上下文对象 | 是 |
also | it | 上下文对象 | 是 |
一下是对作用域函数的简短总结:
- 对一个非空(non-null)对象执行 lambda 表达式:
let
- 将表达式作为变量引入为局部作用域中:
let
fun main() {val nickName = "leavesC"val also = nickName.let {it.length}println(also) //7
}
- 对象配置:
apply
val adam = Person("Adam").apply {age = 32city = "London"
}
println(adam)
- 对象配置并且计算结果:
run
val service = MultiportService("https://example.kotlinlang.org", 80)val result = service.run {port = 8080query(prepareRequest() + " to port $port")
}
- 在需要表达式的地方运行语句:非扩展的
run
val hexNumberRegex = run {val digits = "0-9"val hexDigits = "A-Fa-f"val sign = "+-"Regex("[$sign]?[$digits$hexDigits]+")
}for (match in hexNumberRegex.findAll("+1234 -FFFF not-a-number")) {println(match.value)
}
- 附加效果:
also
val numbers = mutableListOf("one", "two", "three")
numbers.also { println("The list elements before adding new one: $it") }.add("four")
- 一个对象的一组函数调用:
with
val result = with(StringBuilder()) {append("leavesC")append("\n")for (letter in 'A'..'Z') {append(letter)}toString()}println(result)
takeIf
与 takeUnless
除了作用域函数外,标准库还包含函数 takeIf
及 takeUnless
。这俩函数使你可以将对象状态检查嵌入到调用链中。
takeIf 接收一个返回值类型为 bool 的函数,当该参数返回值为 true 时返回接受者对象本身,否则返回 null。
takeUnless 的判断条件与 takeIf 相反。
fun main() {println(check("leavesC")) //7println(check(null)) //0
}fun check(name: String?): Int {return name.takeIf { !it.isNullOrBlank() }?.length ?: 0
}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- Python集合操作
List 添加元素 尾部添加元素:append >>> l [1,2,3] >>> l.append(4) >>> l [1, 2, 3, 4]指定位置添加元素:insert(index从0开始) >>> l [1,2,3] >>> l.insert(2, 4) >>> l [1, 2, 4, 3]列表…...
2024/4/13 6:03:43 - 基础算法——高精度算法 C语言
A 高精度加法 #include<stdio.h> #include<string.h> const int N 1e5 9; int a[N], b[N], c[N]; char A[N], B[N]; void addition(int a[],int b[],int len_a,int len_b) {int i,t0,j;for (i 0; i < len_a || i < len_b; i)//c[0]存个位{if (i &l…...
2024/4/8 19:04:04 - juc并发编程总览
一:线程 线程运行原理 涉及到jvm内存结果. 每个方法都有自己的局部变量表,返回地址.锁记录,操作数栈....
2024/4/8 19:04:03 - Sum Zero(https://acs.jxnu.edu.cn/problem/HDU1895)
2022寒假翻译23 总和零 5000ms 32768K. 描述: 有5个整数阵列,每个整数不超过300个整数,其值在-100,000,000到100,000,000之间,您将找到多少这样的组(i,j,k,l,m…...
2024/4/13 6:03:38 - 数据结构:栈(stack)
只允许在一端进行插入或删除操作的线性表。首先,栈是一种线性表,但限定这种线性表只能在某一段进行插入和删除操作。简单来说就是像球筒中放羽毛球,只能在一端点拿出 球来,先进的球最后拿出来,后进的球先拿出来。 栈顶…...
2024/4/17 5:06:18 - 相同列表长度的乘积
class Solution: ‘’’ 参数A和B:输入列表 返回值:整数是点积 ‘’’ def dotproduct(self,A,B):if len(A)0 or len(B)0 or len(A) !len(B):return "没有点积"a0for i in range(len(A)):aA[i]*B[i]return a#主函数 if name ‘main’: A[1,2,3] B[5,5,5] solution…...
2024/4/13 6:03:33 - 如何运用ghost启动盘进行本机系统备份以及如何还原?
答:1》恢复: 进入GHOST,首先是接受他的协议选择Form Image,恢复镜像来源选择你要恢复的镜像所在目录选择你要恢复的镜像文件显示你镜像的信息,确定显示你当前磁盘信息,确定选择你要恢复的分区(一般我们是选择C盘)最后选择YES,确定(恢复完毕&…...
2024/4/17 16:29:54 - 请排列RJ45交叉双绞线水晶头的顺序?
答:直接线:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕 交叉线:白绿/绿 /白橙 /蓝 /白蓝 /橙 /白棕 / 棕 直连线:是用于连接网络中计算机与集线器…...
2024/4/17 22:50:36 - 兔子模型和斐波那契数列
# 斐波那契数列即是兔子模型[1,1,2,3,5,8,13,21...] def fib(n):if n 1 or n 2:return 1else:return fib(n - 1) fib(n - 2)# 第10个月有多少兔子? print(第十个月总共有, fib(10), 只兔子) # 第十个月总共有 55 只兔子 fib_list [] for i in range(1, 10):fib…...
2024/4/13 6:03:23 - Java基础(14)
多线程 线程是进程中的一个执行实体,用来描述进程的执行,负责指向包括在进程内部地址空间中的代码 在Java中一个应用可以包含多个线程,每个线程执行特定任务,可以与其它线程并发执行引入多线程的目标在于减少CPU空转时间&#x…...
2024/4/13 6:03:28 - 第四章 Shell编程之条件判断流程控制详述
一、条件判断语法结构 思考:何为真(true)?何为假(false)? 1. 条件判断语法格式 格式1: test 条件表达式格式2: [ 条件表达式 ]格式3: [[ 条件表达式 ]] 支持正则 ~ 特别说明: 1)…...
2024/4/8 19:03:57 - 第一章 Shell专题之文本处理工具(grep、cut、sort、uniq、tee、diff、paste、tr)
1. grep工具 grep是**行**过滤工具;用于根据关键字进行行过滤 语法和选项 语法: # grep [选项] 关键字 文件名常见选项: OPTIONS:-i: 不区分大小写-v: 查找不包含指定内容的行,反向选择-w: 按单词搜索-o: 打印匹配关键字-c: 统计匹配到的行…...
2024/4/13 6:03:18 - UML活动图如何表示流程中断
文章目录问题解答问题 在画UML活动图时,如何表示在一个过程中中断,转去执行另一个动作呢? 这么说可能有点太抽象,我们举个实际例子: 比如在用户发起订单后,需要用户确认,系统确认库存ÿ…...
2024/4/18 17:20:14 - Android-基础教程-Intent-categories
Android SDK目录可以查询所有系统action和category Sdk\platforms\android-29\data\activity_actions.txtSdk\platforms\android-29\data\broadcast_actions.txtSdk\platforms\android-29\data\service_actions.txtSdk\platforms\android-29\data\categories.txtSdk\platforms…...
2024/4/13 6:03:48 - 音频-DSD-Delta-Sigma
那个啥,DSD是一种编码格式,更专业是表述是:Delta-Sigma。 这个东西和PCM编码格式是同一作用,都是将模拟量转成数字量的方法,业内简称AD转换。 PCM这种AD转换方式 网上很多资料, 但是DSD(Del…...
2024/4/13 6:03:28 - win11记事本出现乱码怎么恢复 windows11记事本出现乱码的解决方法
Win11记事本出现乱码怎么恢复?有网友反馈在使用记事本来保存一些文字数据的时候,打开突然发现自己的记事本显示全部为乱码。遇到这样的问题要如何解决,跟着小编一起来看看吧。更多windows11系统教程可以参考小白一键网。 Win11记事本出现乱码怎么恢复?…...
2024/4/30 22:03:51 - java编程JDK安装
java编程都需要准备JDK环境。 之前由于学习接口测试时候安装了jmeter工具,修改了JDK环境,导致eclipse不能进行正常运行。 重新安装JDK环境时候由于注册表没有进行清理,导致重装失败。 现记录JDK卸载不干净的处理办法和JDK安装和配置相关。 一…...
2024/4/13 6:03:28 - python递归【一】
大家好,好久没更新系列了,上个系列阅读都800了,今天我来给大家讲一下python的递归。 我认为递归就是在一个函数体内运行该函数,下面看递归最简洁的代码: def digui():print("Hello world!")digui() digui()…...
2024/4/16 11:59:51 - 复合类型:引用和指针
//引用:为对象起了另外一个名字 //不能把int变量赋给 int *的变量,就算变量的值是0也不行 #include<iostream> int main() {using namespace std;//int a 100;//int& b a;//int* p &a;//int* s p;//指针只能用指针类型的变量拷贝&…...
2024/4/13 6:03:43 - jdk7 + Unsupported major.minor version 52.0 (unable to load class okhttp3.RequestBody) 问题
记工作中遇到的okHttp 版本与jdk版本不兼容问题。 目前项目是jdk1.7运行的项目。原先引入的 okHttp版本是3.14.x版本。但是官网 表示 只能 支持jdk8的环境。 报错: org.springframework.web.util.NestedServletException: Handler processing failed; nested excep…...
2024/4/18 8:47:08
最新文章
- 大模型LoRA微调调参的实战技巧
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
2024/5/1 21:28:17 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/3/20 10:50:27 - vue中内置指令v-model的作用和常见使用方法介绍以及在自定义组件上支持
文章目录 一、v-model是什么二、什么是语法糖三、v-model常见的用法1、对于输入框(input):2、对于复选框(checkbox):3、对于选择框(select):4、对于组件(comp…...
2024/5/1 13:24:03 - npm常用命令技巧
NPM (Node Package Manager) 是 JavaScript 的包管理工具,广泛用于管理项目中的依赖。无论是前端项目还是Node.js后端项目,NPM 都扮演着重要的角色。本文将介绍 NPM 中常用的几个命令,并提供相应的代码示例。 1. 初始化项目:npm …...
2024/4/30 9:33:01 - 【外汇早评】美通胀数据走低,美元调整
原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...
2024/5/1 17:30:59 - 【原油贵金属周评】原油多头拥挤,价格调整
原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...
2024/4/30 18:14:14 - 【外汇周评】靓丽非农不及疲软通胀影响
原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...
2024/4/29 2:29:43 - 【原油贵金属早评】库存继续增加,油价收跌
原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...
2024/4/30 18:21:48 - 【外汇早评】日本央行会议纪要不改日元强势
原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...
2024/4/27 17:58:04 - 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响
原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...
2024/4/27 14:22:49 - 【外汇早评】美欲与伊朗重谈协议
原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...
2024/4/28 1:28:33 - 【原油贵金属早评】波动率飙升,市场情绪动荡
原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...
2024/4/30 9:43:09 - 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试
原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...
2024/4/27 17:59:30 - 【原油贵金属早评】市场情绪继续恶化,黄金上破
原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...
2024/4/25 18:39:16 - 【外汇早评】美伊僵持,风险情绪继续升温
原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...
2024/4/28 1:34:08 - 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势
原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...
2024/4/26 19:03:37 - 氧生福地 玩美北湖(上)——为时光守候两千年
原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...
2024/4/29 20:46:55 - 氧生福地 玩美北湖(中)——永春梯田里的美与鲜
原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...
2024/4/30 22:21:04 - 氧生福地 玩美北湖(下)——奔跑吧骚年!
原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...
2024/5/1 4:32:01 - 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!
原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...
2024/4/27 23:24:42 - 「发现」铁皮石斛仙草之神奇功效用于医用面膜
原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...
2024/4/28 5:48:52 - 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者
原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...
2024/4/30 9:42:22 - 广州械字号面膜生产厂家OEM/ODM4项须知!
原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...
2024/4/30 9:43:22 - 械字号医用眼膜缓解用眼过度到底有无作用?
原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...
2024/4/30 9:42:49 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57