Kotlin-vararg,变量var,val,${}和函数when,for-in(第一行代码Kotlin学习笔记1)

摘要:最近在看郭霖大神的书《第一行代码-第三版》,由于谷歌喊出“Kotlin first”的口号也已经有些时日,本人也一直也想学习下使用Kotlin编写Android程序,但无奈今年公司的业务没什么Android程序可开发,Kotlin也是学过就忘,在改需求时,也没有时间去重新熟悉Kotlin,没有办法使用Kotlin来直接写新需求。看了《第一行代码-第三版》这本书后,觉得里面关于Kotlin的知识讲的简洁明了而且很有调理,我就抽空将书中关于Kotlin的知识的精华部分记录了一下,方便日后学习使用。

1. 变量

1.1 变量声明

val:(value)简写,用来声明一个不可变的变量,赋值之后不可重新赋值,对应java中的final变量。
var:(variable)简写,用来声明一个可变的变量。

fun main(){
	val a = 5
	println(a = ${a})//a = 5
	a = a * 10 // 报错,可改为 var a = 5;
}

Kotlin虽然拥有出色的类推导机制,但是有时我们不得不在声明变量时,指定变量类型

fun main(){
	val a : Int = 5 //声明a为Int型变量
	println(a = ${a})//a = 5
}

1.2 字符串内嵌表达式

上段代码中,println(a = ${a})//a = 5是我们在Java中不曾见到的写法,但是Kotlin却支持这样的字符串内嵌表达式,它允许我们在字符串里嵌入 ${ } 这种语法结构的表达式,并在运行的时候使用表达式执行的结果代替这一部分内容。

var str :String = "hello, ${obj.name}, nice to meet you"

当表达式中只有一个变量的时候,我们还可以将两边的打括号省略:

var name = obj.name
var str :String = "hello, $name, nice to meet you"

2. 函数

//格式
fun methodName(param1:Int,param2:String) : Int{
	//声明第一个参数为Int,第二个参数为String类型,返回值为Int类型的函数
}
//获取两个数中较大的一个并返回
fun getLargeNum(a: Int, b: Int) :Int {
    return max(a,b)
}

语法糖:当函数中只有一行代码时,我们可以不写函数体,将唯一一行代码写在函数尾部即可。

//获取两个数中较大的一个并返回
fun getLargeNum(a: Int, b: Int) :Int = max(a,b)

由于函数max()返回一个Int值,并且此函数只有一行代码,所以返回值类型也可以省略。

//获取两个数中较大的一个并返回
fun getLargeNum(a: Int, b: Int) = max(a,b)

在Kotlin中,我们还可以为函数的参数设置默认值例如:

fun printParams(num: Int, str: String = "hello"){
	println("num is $num, str is $str")
}

这样我么在调用printParams的时候,可以只传第一个参数,第二个参数可传可不传。

fun main() {
    printParams(5)
}
//num is 5, str is hello

这时大家可能会有疑惑,刚才恰好我们是最后一个参数拥有默认值,如果我么第一个参数拥有默认值,显然调用时是不能这么传参的,因为编译器并不知道你传的参数是要赋值给哪一个形参。不过不用担心,Kotlin提供了另外一种机制,就是可以通过键值对的方式来传参,比如我们可以这么写:

fun main() {
    printParams(str = "hello")
}
fun printParams(num: Int = 5, str: String){
    println("num is $num, str is $str")
}
//num is 5, str is hello

2.1 vararg

vararg对应的是Java中的可变参数列表,我们允许向这个方法传入多个同样类型的参数。这些参数都会被赋值到vararg声明的这个变量上面,然后用循环可以将传入的所有参数遍历出来,示例如下:

fun max(vararg nums:Int) : Int{
    var max = Int.MIN_VALUE
    for (num in nums){
       max = kotlin.math.max(max,num)
    }
    return max
}

fun main() {
    var max = max(1,2,4,5)
    println("max = $max")
}
//max = 5

Kotlin中max()函数,只能比较两个数字大小,我们自己封装max()函数,接收若干个Int类型参数,然后再用循环比较,就可以找出若干个整型数字中最大的数了。

3. 语法

3.1 if 语句

常规用法

//获取两个数中较大的一个并返回
fun getLargeNum(a: Int,b: Int) : Int{
    var large = 0;
    if(a > b ){
        large = a
    }else {
        large = b
    }
    return large
}

不同于java之处,kotlin中if可以有返回值,返回if语句每一个条件中最后一行代码的值。

//获取两个数中较大的一个并返回
fun getLargeNum(a: Int,b: Int) : Int{
    var large = if(a > b ){
        a
    }else {
        b
    }
    return large
}

由于large为多余的变量,并且此函数只有一行代码,因此,可以简写为:

//获取两个数中较大的一个并返回
fun getLargeNum(a: Int, b: Int) = if (a > b) { a } else { b }
//继续精简
fun getLargeNum(a: Int, b: Int) = if (a > b)  a  else  b 

3.2 when 语句

Kotlin中的when语句,有些类似于java中的switch语句,而switch语句完全可以用if…elseif…else代替
when语句语法:匹配值 -> { 执行逻辑 }

//只有一行代码时{}可以省略
fun getScore(name: String) = when (name) {
    "Tom" -> 86
    "Jim" -> 77
    "Jack" -> 95
    "Lily" -> 100
    else -> 0
}

when语句在使用时,我们可以不用将参数传入when语句:

//只有一行代码时{}可以省略
fun getScore(name: String) = when {
    name.startsWith("Tom") -> 86
    name == "Jim" -> 77
    name == "Jack" -> 95
    name == "Lily" -> 100
    else -> 0
}

除了精确匹配之外,when语句还允许进行类型匹配。

//is 相当于 java 中的 instanceof 关键字,
fun checkNumber(num: Number) {
    when (num) {
        is Int -> println("number is Int")
        is Double -> println("number is Double")
        else -> println("number not support")
    }
}

3.3 循环(for-in)与区间

我们都知道,Java中有while和for两种循环,Kotlin同样提供了while和for两种循环,while 循环和Java完全一致,不同的是Kotlin舍弃了for-i循环,使用的是for-each循环的增强版本for-in,下面我们结合区间的概念,学习一下for-in的用法。
我们可以使用如下Kotlin代码来表示一个区间:

val range = 0..10

上述代码表示创建了一个0到10的区间,并且两端都是闭区间,这意味着0到10这两个端点都是包含在区间中的,用数学的方式表达出来就是[0, 10]。

也可以使用until关键字来创建一个左闭右开的区间:

val range = 0 until 10

上述代码表示创建了一个0到10的左闭右开区间,它的数学表达方式是[0, 10)。有了区间之后,我们就可以通过for-in循环来遍历这个区间:

fun main() {
    for (i in 0..5) {
        println(i)
    }
}
//输出 0 1 2 3 4 5

如果你想跳过其中的一些元素,可以使用step关键字:

fun main() {
    for (i in 0 until 10 step 2) {
        println(i)
    }
}
//输出 0 2 4 6 8

如果你想创建一个降序的区间,可以使用downTo关键字:

fun main() {
    for (i in 5 downTo 1) {
        println(i)
    }
}
//输出 5 4 3 2 1

for-in除了可以对区间进行遍历之外,还可以用于遍历数组和集合: Kotlin-集合与Lambda编程map,filter,any,all函数的使用(第一行代码Kotlin学习笔记3))

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为AI语言模型,我无法提供完整的安卓应用程序。下面是一个简单的示例,可用于开始编写新闻应用程序: 1. 在Android Studio中创建一个新项目,并选择Kotlin作为主要语言。 2. 在项目中创建一个RecyclerView,用于显示新闻列表。 3. 创建一个新闻数据模型类,包括标题、描述、图片等信息。例如: ``` data class News(val title: String, val description: String, val image: Int) ``` 4. 创建一个新闻适配器类,用于将新闻数据绑定到RecyclerView中的项。例如: ``` class NewsAdapter(private val newsList: List<News>) : RecyclerView.Adapter<NewsAdapter.ViewHolder>() { class ViewHolder(view: View) : RecyclerView.ViewHolder(view) { val titleTextView: TextView = view.findViewById(R.id.title_text_view) val descriptionTextView: TextView = view.findViewById(R.id.description_text_view) val imageView: ImageView = view.findViewById(R.id.image_view) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context).inflate(R.layout.news_item, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { val news = newsList[position] holder.titleTextView.text = news.title holder.descriptionTextView.text = news.description holder.imageView.setImageResource(news.image) } override fun getItemCount() = newsList.size } ``` 5. 在MainActivity中初始化新闻数据,并将其传递给适配器。例如: ``` class MainActivity : AppCompatActivity() { private lateinit var newsRecyclerView: RecyclerView private lateinit var newsAdapter: NewsAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) newsRecyclerView = findViewById(R.id.news_recycler_view) newsAdapter = NewsAdapter(getNewsList()) newsRecyclerView.adapter = newsAdapter newsRecyclerView.layoutManager = LinearLayoutManager(this) } private fun getNewsList(): List<News> { return listOf( News("新闻标题1", "新闻描述1", R.drawable.news_image1), News("新闻标题2", "新闻描述2", R.drawable.news_image2), News("新闻标题3", "新闻描述3", R.drawable.news_image3), // 添加更多新闻... ) } } ``` 6. 在布局文件中添加RecyclerView和新闻项布局。例如: ``` <androidx.recyclerview.widget.RecyclerView android:id="@+id/news_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" android:padding="16dp" app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager" app:layout_constraintTop_toTopOf="parent" app:layout_constraintBottom_toBottomOf="parent"/> <LinearLayout android:id="@+id/news_item" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <ImageView android:id="@+id/image_view" android:layout_width="match_parent" android:layout_height="200dp" android:scaleType="centerCrop"/> <TextView android:id="@+id/title_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="18sp" android:textStyle="bold" android:padding="8dp"/> <TextView android:id="@+id/description_text_view" android:layout_width="match_parent" android:layout_height="wrap_content" android:textSize="14sp" android:padding="8dp"/> </LinearLayout> ``` 这只是一个简单的示例,你可以根据自己的需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值