package com.example.test02
import kotlin.math.max
fun main(args: Array<String>) {
val a = 10 // 常量Int
var aa = 10L // 变量Long
var b = "string" // 变量string
// if 语句有返回值
b = if (a > 5) {
println(">")
">"
} else {
println("<")
"<"
}
b = when(a) {
1 -> "1"
2 -> {
print("")
"2"
}
else -> "3"
}
b = when {
a > 0 -> "1"
a > 10 && a % 2==0 -> "2"
else -> "3"
}
// 循环 while 和java中相同
var range = 0..10 // IntRange 变量
for (i in 1..10) {
println(i)
}
for (i in 1 until 10 step 2) { // 左闭右开区间,每次递增2
println(i)
}
// for (i in 10 downTo 1 step 2) [10, 1]每次递增2
println("Hello")
}
// 可使用默认参数,使用时可省略靠后的参数,也可指定传参
fun function(param1:Int = 0, param2: String = " ") {
return
}
fun getMax(num1: Int, num2:Int) : Int = max(num1, num2)
fun getMax2(num1: Int, num2: Int) = if (num1 > num2) num1 else num2
fun checkNumber(num: Number) {
when (num) {
is Int -> println("Int")
is Double -> {
println("Double")
}
else -> println("else")
}
}
/************************** 面向对象(注意,类似java,每个类一个文件) *****************************/
/*
* Kotlin 中有 主构造函数 和 次构造函数
* + 主构造函数
* 类名后的圆括号,其中的字段名用于赋值。默认为空
* 在创建下方Student时必须传入参数 `val stu = Student("a123", 5)`
* 继承时必须通过 () 指定调用的构造方法
* + 次构造函数
* 类内部的 init 代码块
* 当一个类既有主构造函数又有次构造函数时,所有的次构造函数都必须调用主构造函数(包括间接调用)
*/
open class Clazz {
var param1 = ""
var param2 = 0
fun info() {
println("$param1 $param2")
}
}
// 加上open后这个类才可以基础,默认不可以
open class Person(val name: String, val age: Int) {
fun info() {
println(name + " is " + age + "years old.")
}
}
// Student 不可以被继承
// 构造时传入父类参数,再用于构造父类
// 主构造中传给父类的参数不能使用 var val,使用了就是自己的,不能传给父类
// 3种构造方法:
// val stu1 = Student()
// val stu2 = Student("123", 10)
// val stu3 = Student("123", 1, "123", 19)
class Student(val sno:String, val grade: Int, name: String, age: Int) : Person(name, age), Study {
// 主构造函数的的函数体
init {
println("this is init function.")
}
// 次构造函数,必须调用主构造函数
constructor(name: String, age: Int) : this("", 0, name, age) {
}
constructor() : this("", 0) {
}
override fun readBooks() {
}
}
// 只有次构造函数,没有主构造函数
class Student2 : Person {
constructor(name: String, age: Int) : super(name, age) {}
}
// 接口与java种几乎相同,类实现时使用 : 和继承一样
interface Study {
fun readBooks()
fun doHomework() {
println("接口的默认实现")
}
}
// 可见性修饰符有4种:public(默认)、private(当前类可见)、protected(当前类、子类可见)、internal(只对同一模块可见)
// 数据类,自动实现 equals() hashcode() toString() 等方法
data class Cellphone(val brand: String, val price: Double)
// 单例类
object Singleton {
fun singletonTest() {
println("singletonTest is called.")
}
}
/****************************** Lambda ********************************/
// {参数名1: 参数类型, 参数名2: 参数类型 -> 函数体}
fun f() {
val list = ArrayList<String>()
list.add("Apple")
list.add("Banana")
list.add("Orange")
val list2 = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val list3 = mutableListOf("Apple", "Banana", "Orange", "Pear", "Grape")
val set = setOf("Apple", "Banana", "Orange", "Pear", "Grape")
val map1 = HashMap<String, Int>()
map1["Apple"] = 1
map1["Banana"] = 2
map1["Orange"] = 3
map1["Pear"] = 4
map1["Grape"] = 5
val map2 = mapOf("Apple" to 1, "Banana" to 2, "Orange" to 3, "Pear" to 4, "Grape" to 5)
for ((fruit, number) in map2) {
println("fruit is $fruit, number is $number")
}
val maxLengthFruit1 = list.maxBy({ fruit: String -> fruit.length })
val maxLengthFruit2 = list.maxBy() { fruit: String -> fruit.length }
val maxLengthFruit3 = list.maxBy { fruit: String -> fruit.length }
val maxLengthFruit4 = list.maxBy { it.length }
val newList5 = list.map { it.uppercase() }
val newList6 = list.filter { it.length <= 5 }.map { it.uppercase() }
val anyResult : Boolean = list.any { it.length <= 5 } // 是否有长度大于5的
val allResult : Boolean = list.all { it.length <= 5 } // 是否全部长度大于5
}
/*************************** 空指针 **************************/
// 可以直接用 == 比较类和string,不需要equal方法
// 利用编译时判空检查的机制几乎杜绝了空指针异常
// 空指针异常的检查提前到了编译时期,如果我们的程序存在空指针异常的风险,那么在编译的时候会直接报错,
// 修正之后才能成功运行,这样就可以保证程序在运行时期 不会出现空指针异常了。
fun f2() {
doStudy(null) // 报错,无法编译
doStudy2(null) // 正确
}
fun doStudy(study: Study) { // 此时无法传入 null
study.readBooks()
study.doHomework()
}
fun doStudy2(study: Study?) {
if (study != null) {
study.doHomework()
study.readBooks()
}
study?.readBooks() // 省略了 if-null 判断
var c = study ?: " " // val c = if (study != null) {study} else {" "}
}
fun getTextLength(text: String) = text?.length ?: 0
/****************************** 标准函数 let with run apply*********************************/
/*
let 主要配合 ?. 使用
obj.let { obj2 ->
// 编写具体的业务逻辑
}
obj 作为lambda的参数传入
*/
fun doStudy3(study: Study?) {
study?.let {
it.readBooks()
it.doHomework()
}
}
/*
val result = with(obj : 任意类型) { // lambda表达式
// 这里是obj的上下文
"value" // with函数的返回值
}
*/
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = with(StringBuilder()) {
// 整个Lambda表达式的上下文就会是这个StringBuilder对象
append("Start eating fruits.\n")
for (fruit in list) {
append(fruit).append("\n")
}
append("Ate all fruits.")
toString()
}
println(result)
/*
与with类似
val result = obj.run {
// 这里是obj的上下文
"value" // run函数的返回值
}
*/
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().run {
append("Start eating fruits.\n")
for (fruit in list) {
append(fruit).append("\n")
}
append("Ate all fruits.")
toString()
}
println(result)
/*
与run类似apply函数无法指定返回值,而是会自动返回调用对象本身
val result = obj.apply {
// 这里是obj的上下文
}
// result == obj
*/
val list = listOf("Apple", "Banana", "Orange", "Pear", "Grape")
val result = StringBuilder().apply {
append("Start eating fruits.\n")
for (fruit in list) {
append(fruit).append("\n")
}
append("Ate all fruits.")
}
println(result.toString())
/******************************* 定义静态方法 ****************************/
/*
1. @JvmStatic 注解
2. 顶层方法:那些没有定义在任何类中的方法,比如 main() 方法。
顶层方法在kotlin中直接调用即可,无需包名、路径
java调用时要使用 文件名.顶层方法() 调用,编译器自动生成一个与文件名同名的类
*/
class Util {
fun doAction1() {
println("do action1")
}
companion object {
@JvmStatic // 只能加在单例类或companion object中的方法上
fun doAction2() {
println("do action2")
}
}
}
// Util.doAction2() 调用
标签:val,Kotlin,list,fun,fruit,println,构造函数 From: https://www.cnblogs.com/zhh567/p/17017585.html