val set : MutableSet<String> = mutableSetOf("李元霸", "李连杰")
set += "李俊"
set += "李天"
set -= "李连杰"
set.add("刘军")
set.remove("刘军")
println(set)
集合转换与快捷函数
val list : MutableList<String> = mutableListOf("Derry", "Derry", "Derry", "Leo", "Lance") // list 可以重复元素
println(list)
// List 转 Set 去重
val set /*: Set<String>*/ = list.toSet()
println(set)
// List 转 Set 转 List 也能去重
val list2 /*: List<String>*/ = list.toSet().toList()
println(list2)
// 快捷函数去重 distinct
println(list.distinct()) // 内部做了:先转变成 可变的Set结合 在转换成 List集合
println(list.toMutableSet().toList()) // 和上面代码等价
// 1.可变集合的操作 += [] put
val map : MutableMap<String, Int> = mutableMapOf(Pair("Derry", 123), "Kevin" to 456, Pair("Dee", 789))
// 下面是可变操作
map += "AAA" to(111)
map += "BBB" to 1234
map -= "Kevin"
map["CCC"] = 888
map.put("DDD", 999) // put 和 [] 等价的
// 2.getOrPut 没有有的情况
// 如果整个map集合里面没有 FFF的key 元素,我就帮你先添加到map集合中去,然后再从map集合中获取
val r: Int = map.getOrPut("FFF") { 555 }
println(r)
println(map["FFF"]) // 他已经帮你加入进去了,所以你可以获取
// 3.getOrPut 有的情况
val r2 = map.getOrPut("Derry") {666} // 发现Derry的key是有的,那么就直接获取出来, 相当于666备用值就失效了
println(r2)
定义类与field关键字学习
var name = "KK"
get() = field
set(value) {
field = value
}
var value = "ABCDEFG"
// 下面的隐式代码,不写也有,就是下面这个样子
get() = field
set(value) {
field = value
}
var info = "abcdefg ok is success"
get() = field.capitalize() // 把首字母修改成大写
set(value) {
field = "**【$value】**"
}
// 背后隐式代码:ne
w KtBase70().setName("Kevin");
KtBase70().name = "Kevin"
// 背后隐式代码:System.out.println(new KtBase70().getName());
println(KtBase70().name)
println(">>>>>>>>>>>>>>>>>>")
// 背后隐式代码:System.out.println(new KtBase70().getInfo());
println(KtBase70().info)
// 背后隐式代码:new KtBase70().setInfo("学习KT");
KtBase70().info = "学习KT"
Kotlin语言的 计算属性 与 防范竞态条件
val number : Int = 0
/* 背后的代码:
private int number = 0;
public int getNumber() {
return this.number;
}
*/
// 计算属性 下面这样写 get函数覆盖了 field 内容本身,相当于field失效了,无用了,以后用不到了
val number2 : Int
get() = (1..1000).shuffled().first() // 从1到1000取出随机值 返回给 getNumber2()函数
/*
背后隐式代码:
为什么没有看到 number2 属性定义?
答:因为属于 计算属性 的功能,根本在getNumber2函数里面,就没有用到 number2属性,所以 number2属性 失效了,无用了,以后用不到了
public int getNumber2() {
return (1..1000).shuffled().first()java的随机逻辑 复杂 ;
}
*/
var info: String ? = null // ""
// 防范竞态条件 当你调用成员,这个成员,可能为null,可能为空值,就必须采用 防范竞态条件,这个是KT编程的规范化
fun getShowInfo() : String {
// 这个成员,可能为null,可能为空值,就启用 防范竞态条件
// 这种写法,就属于 防范竞态条件,我们可以看到专业的KT开发者,有大量这种代码
// also永远都是返回 info本身
return info?.let {
if (it.isBlank()) {
"info你原来是空值,请检查代码..." // 是根据匿名函数最后一行的变化而变化
} else {
"最终info结果是:$it" // 是根据匿名函数最后一行的变化而变化
}
} ?: "info你原来是null,请检查代码..."
}
主构造函数
class KtBase72(_name: String, _sex: Char, _age: Int, _info: String) // 主构造函数
{
var name = _name
get() = field // get不允许私有化
private set(value) {
field = value
}
val sex = _sex
get() = field
// set(value) {} val只读的,不能修改的,不能set函数定义
val age: Int = _age
get() = field + 1
val info = _info
get() = "【${field}】"
fun show() {
// println(_name) 临时的输入类型,不能直接用,需要接收下来 成为变量才能用
println(name)
println(sex)
println(age)
println(info)
}
}
主构造函数里定义属性
// var name: String 就相当于 var name = _name 这不过你看不到而已
// 一步到位,不像我们上一篇是分开写的
class KtBase73 (var name: String, val sex: Char, val age: Int, var info: String)
{
fun show() {
println(name)
println(sex)
println(age)
println(info)
}
}