返回顶部
首页 > 资讯 > 精选 >Kotlin基础入门 - for、forEach 循环
  • 912
分享到

Kotlin基础入门 - for、forEach 循环

AndroidKotlinfor循环forEach循环step多列表循环 2023-08-19 17:08:13 912人浏览 安东尼
摘要

不论身处何方 for循环这种操作都随处可见,鉴于大多数Android开发都是从Java转到Kt的,所以我的思路是从Java的使用习惯来讲一些Kt 的for、forEach 循环方式 基础 for循环惯性 for循环进阶 f

不论身处何方 for循环这种操作都随处可见,鉴于大多数Android开发都是从Java转到Kt的,所以我的思路是从Java的使用习惯来讲一些Kt 的for、forEach 循环方式

基础 for循环

for循环 一般作用于list、map数据集合,这里我直接创建了一个只读List集合

  val dataList = listOf("apple", "banana", "orange")  val numList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)

提前了解

  //Java中获取list循环数据的方式  dataList.get(i)  //Java中获取数组数据的方式  dataList[i]  //在Kt中不论是集合还是数组都用以下方式  dataList[i]

惯性 for循环

所谓的惯性思维,指的是从Java过渡的常规for循环思想,均是循环获取角标,然后根据角标取对应值;如下

  for (int i = 0; i < list.size(); i++) { }

惯性方式1:在 Kt 中,通常使用 start .. end 来代表一段区间 ,如下就是类似Java的写法,定义一个变量,循环区间定义在 0 - List.size - 1,循环时获取list中每个索引的值

    fun basicsFor1(dataList: List<String>) {        for (i in 0..dataList.size - 1) {            println("basicsFor1:" + dataList[i])        }    }

惯性方式2:使用Ranges.kt下的until来代表循环区间,从而完成 for循环

    fun basicsFor2(dataList: List<String>) {        for (i in 0 until dataList.size) {            println("basicsFor2:" + dataList[i])        }    }

输出结果

 com.example.fordemo                  I  basicsFor1:apple com.example.fordemo                  I  basicsFor1:banana com.example.fordemo                  I  basicsFor1:orange com.example.fordemo                  I  basicsFor2:apple com.example.fordemo                  I  basicsFor2:banana com.example.fordemo                  I  basicsFor2:orange

有的人可能发现 dataList.size 没有-1,这样会不会造成数组越界?我们看一下 Int 的 until 扩展函数,你会发现在其内部也是封装了区间处理,故使用无忧

在这里插入图片描述


进阶 for循环

Look:以下俩种方式都很常用,可根据需求自行选取

进阶方式1:使用Collections .kt下的indices来代表循环区间,从而完成 for循环

    fun basicsFor3(dataList: List<String>) {        for (i in dataList.indices) {            println("basicsFor3:" + i)            println("basicsFor3:" + dataList[i])        }    }

同上疑问,我们看一下 Collection 的 indices扩展属性,你会发现在其内部也是封装了循环区间,故亦无忧

在这里插入图片描述

输出结果

 com.example.fordemo                  I  basicsFor3:0 com.example.fordemo                  I  basicsFor3:apple com.example.fordemo                  I  basicsFor3:1 com.example.fordemo                  I  basicsFor3:banana com.example.fordemo                  I  basicsFor3:2 com.example.fordemo                  I  basicsFor3:orange

进阶方式2:这种方式应该是最快捷的一种循环方式,从循环区间的定义到值的输出都很方便,但是如果需要角标做一些其他操作的话,并不太适合,可用上者~

    fun basicsFor4(dataList: List<String>) {        for (i in dataList) {            println("basicsFor4:$i")        }    }

输出结果

 com.example.fordemo                  I  basicsFor4:apple com.example.fordemo                  I  basicsFor4:banana com.example.fordemo                  I  basicsFor4:orange

倒序 for循环

之前的 for循环 方式都是正序的,在一些场景下我们需要倒序,故此也可以学一学

        fun invertedFor(numList: List<Int>) {        for (i in numList.size - 1 downTo 0) {            println("invertedFor:" + numList[i])        }    }

没事儿看看 downTo源码,发现也是一个区间定义

在这里插入图片描述

输出结果

com.example.fordemo                  I  invertedFor:10com.example.fordemo                  I  invertedFor:9com.example.fordemo                  I  invertedFor:8com.example.fordemo                  I  invertedFor:7com.example.fordemo                  I  invertedFor:6com.example.fordemo                  I  invertedFor:5com.example.fordemo                  I  invertedFor:4com.example.fordemo                  I  invertedFor:3com.example.fordemo                  I  invertedFor:2com.example.fordemo                  I  invertedFor:1

forEach循环

众所周知在Java中提供了forEach循环,同理Kt也支持使用forEach循环;使用时都是通过 list.forEach... 方式,来看一看提供的方法有forEachforEachIndexed,主要区别在于是否需要index角标,其余都是重载方法~

在这里插入图片描述

forEach

    fun forEach(dataList: List<String>) {        dataList.forEach {            println(it)        }    }

输出结果

com.example.fordemo                  I  applecom.example.fordemo                  I  bananacom.example.fordemo                  I  orange

也可以直接用 区间+forEach循环,以下为示例...

整数型的集合,可以免创建list

    fun forEach() {        (0..6).forEach{            println(it)        }    }

输出结果

com.example.fordemo                  I  0com.example.fordemo                  I  1com.example.fordemo                  I  2com.example.fordemo                  I  3com.example.fordemo                  I  4com.example.fordemo                  I  5com.example.fordemo                  I  6

其他类型需要声明对应的集合,可直接声明全局list或传参函数内部

区间 (0..dataList.size - 1) + forEach

    fun forEach(dataList: List<String>) {        (0..dataList.size - 1).forEach {            println(dataList[it])        }    }

输出结果

com.example.fordemo                  I  applecom.example.fordemo                  I  bananacom.example.fordemo                  I  orange

区间(dataList.indices)+ forEach

    fun forEach() {        (dataList.indices).forEach {            println(dataList[it])        }    }

输出结果

com.example.fordemo                  I  applecom.example.fordemo                  I  bananacom.example.fordemo                  I  orange

forEachIndexed

    fun forEachIndexed(dataList: List<String>) {        dataList.forEachIndexed { index, it ->            println("角标=$index 元素=${it}")        }    }

输出结果

com.example.fordemo                  I  角标=0 元素=applecom.example.fordemo                  I  角标=1 元素=bananacom.example.fordemo                  I  角标=2 元素=orange

for循环 step过滤

step 本意是跳过的意思,之所以我说是过滤,只因个人感觉step也是过滤数据的一种方式而已

初浅看一下setp函数,发现支持的入参均为整数型,故下方案例我们都传整数

在这里插入图片描述

常规开发中 step 跳过的数据,一般是 setp数值*倍数(依次从1,2,3...) os:尝试抛开角标的概念,单纯从第几个数的角度去看待这个场景

string集合

  for (i in dataList.indices step 2) {      println("stepFor:" + dataList[i])  }

输出结果

com.example.fordemo                  I  stepFor:applecom.example.fordemo                  I  stepFor:orange

int集合

  for (i in numList.indices step 2) {      println("stepFor:" + numList[i])  }

输出结果

com.example.fordemo                  I  stepFor:1com.example.fordemo                  I  stepFor:3com.example.fordemo                  I  stepFor:5com.example.fordemo                  I  stepFor:7com.example.fordemo                  I  stepFor:9

int集合(倒序)

  for (i in numList.size-1 downTo 0 step 2){      println("stepFor:" + numList[i])  }

输出结果

com.example.fordemo                  I  stepFor:10com.example.fordemo                  I  stepFor:8com.example.fordemo                  I  stepFor:6com.example.fordemo                  I  stepFor:4com.example.fordemo                  I  stepFor:2

for循环 同时获取index、数据

按照以前的常规方式,上方也有讲过

    fun basicsIndexItemFor(dataList: List<String>) {        for (index in dataList.indices) {            println("basicsIndexItemFor-index:" + index + " basicsIndexItemFor-item:" + dataList[index])        }    }

输出结果

com.example.fordemo                  I  indexItemFor-index:0 indexItemFor-item:applecom.example.fordemo                  I  indexItemFor-index:1 indexItemFor-item:bananacom.example.fordemo                  I  indexItemFor-index:2 indexItemFor-item:orange

kt提供的方式(java可能也有)

        fun indexItemFor(dataList: List<String>) {        for ((index, item) in dataList.withIndex()) {            println("indexItemFor-index:" + index + " indexItemFor-item:" + item)        }    }

输出结果

com.example.fordemo                  I  basicsIndexItemFor-index:0 basicsIndexItemFor-item:applecom.example.fordemo                  I  basicsIndexItemFor-index:1 basicsIndexItemFor-item:bananacom.example.fordemo                  I  basicsIndexItemFor-index:2 basicsIndexItemFor-item:orange

for循环 多变量、多列表

kt 中的多列表循环,主要用到了 zip关键字关联集合;这种方式是存在一定不足的,例如当前A列表内部只存在3条数据,B列表数据>3条,最后的结果就是B列表也仅会输出前三条!!!

        fun doubleFor(dataList: List<String>,numList: List<Int>) {        for ((i, j) in dataList.indices.zip(numList.indices)) {            println("dataList:" + dataList[i] + " numList:" + numList[j])        }    }

输出结果

com.example.fordemo                  I  dataList:apple numList:1com.example.fordemo                  I  dataList:banana numList:2com.example.fordemo                  I  dataList:orange numList:3

kt 提供的这种场景,其实大致等同于以下的循环方式(抛开上面提到的不足)

    fun doubleDataFor(dataList: List<String>) {        for (i in dataList.indices) {            println("dataList:" + dataList[i])        }    }    fun doubleNumFor(numList: List<Int>) {        for (i in numList.indices) {            println("numList:" + numList[i])        }    }

输出结果

com.example.fordemo                  I  dataList:applecom.example.fordemo                  I  dataList:bananacom.example.fordemo                  I  dataList:orangecom.example.fordemo                  I  numList:1com.example.fordemo                  I  numList:2com.example.fordemo                  I  numList:3com.example.fordemo                  I  numList:4com.example.fordemo                  I  numList:5com.example.fordemo                  I  numList:6com.example.fordemo                  I  numList:7com.example.fordemo                  I  numList:8com.example.fordemo                  I  numList:9com.example.fordemo                  I  numList:10

不知道有人会不会有人和我一样懒,既然多列表循环,用的角标值也一样,能不能直接声明一个变量就好... 事实就是提示用Pair类~ 那么什么是Pair类呢?

在这里插入图片描述

没事儿做,一起看看zip源码

  • zip 函数,返回的是List
    在这里插入图片描述
  • Pair类
    在这里插入图片描述
  • zip 实现
    在这里插入图片描述

Pair 类+zip 多列表循环

    fun doublePairFor(dataList: List<String>, numList: List<Int>) {        for (Pair in dataList.indices.zip(numList.indices)) {            println("dataList&numList:$Pair")            println("dataList&numList:"+dataList[Pair.first]+"-"+numList[Pair.second])        }    }

输出结果

com.example.fordemo                  I  dataList&numList:(0, 0)com.example.fordemo                  I  dataList&numList:apple-1com.example.fordemo                  I  dataList&numList:(1, 1)com.example.fordemo                  I  dataList&numList:banana-2com.example.fordemo                  I  dataList&numList:(2, 2)com.example.fordemo                  I  dataList&numList:orange-3

总结

首先,我写的这些 for循环 都是木有问题的,都循环的很漂亮,知悉一下哈~

在这里插入图片描述
在这里插入图片描述

Demo 源码

package com.example.fordemoimport android.os.Bundleimport androidx.appcompat.app.AppCompatActivityclass MainActivity : AppCompatActivity() {    private val dataList = listOf("apple", "banana", "orange")    private val numList = listOf(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        basicsFor1(dataList)        basicsFor2(dataList)        basicsFor3(dataList)        basicsFor4(dataList)        invertedFor(numList)        stepFor()        indexItemFor(dataList)        basicsIndexItemFor(dataList)        doubleFor(dataList, numList)        doubleDataFor(dataList)        doubleNumFor(numList)        doublePairFor(dataList, numList)        forEach(dataList)        forEachIndexed(dataList)    }        private fun stepFor() {        for (i in dataList.indices step 2) {            println("stepFor:" + dataList[i])        }        for (i in numList.indices step 2) {            println("stepFor:" + numList[i])        }        for (i in numList.size - 1 downTo 0 step 2) {            println("stepFor:" + numList[i])        }    }    private fun forEach(dataList: List<String>) {        dataList.forEach {            println(it)        }    }    private fun forEachIndexed(dataList: List<String>) {        dataList.forEachIndexed { index, it ->            println("角标=$index 元素=${it}")        }    }    private fun basicsFor1(dataList: List<String>) {        for (i in 0..dataList.size - 1) {            println("basicsFor1:" + dataList[i])        }    }    private fun basicsFor2(dataList: List<String>) {        for (i in 0 until dataList.size) {            println("basicsFor2:" + dataList[i])        }    }    private fun basicsFor3(dataList: List<String>) {        for (i in dataList.indices) {            println("basicsFor3:" + i)            println("basicsFor3:" + dataList[i])        }    }    private fun basicsFor4(dataList: List<String>) {        for (i in dataList) {            println("basicsFor4:$i")        }    }        private fun invertedFor(numList: List<Int>) {        for (i in numList.size - 1 downTo 0) {            println("invertedFor:" + numList[i])        }    }        private fun indexItemFor(dataList: List<String>) {        for ((index, item) in dataList.withIndex()) {            println("indexItemFor-index:" + index + " indexItemFor-item:" + item)        }    }    private fun basicsIndexItemFor(dataList: List<String>) {        for (index in dataList.indices) {            println("basicsIndexItemFor-index:" + index + " basicsIndexItemFor-item:" + dataList[index])        }    }        private fun doubleFor(dataList: List<String>, numList: List<Int>) {        for ((i, j) in dataList.indices.zip(numList.indices)) {            println("dataList:" + dataList[i] + " numList:" + numList[j])        }    }    private fun doubleDataFor(dataList: List<String>) {        for (i in dataList.indices) {            println("dataList:" + dataList[i])        }    }    private fun doubleNumFor(numList: List<Int>) {        for (i in numList.indices) {            println("numList:" + numList[i])        }    }    private fun doublePairFor(dataList: List<String>, numList: List<Int>) {        for (Pair in dataList.indices.zip(numList.indices)) {            println("dataList&numList:$Pair")            println("dataList&numList:" + dataList[Pair.first] + "-" + numList[Pair.second])        }    }}

具体使用哪种循环方式,根据自身需求寻找即可,但是使用基础for循环AndroidStudio 会报警告,具体如下

在这里插入图片描述

根据提示 - 修改警告内容后,你会发现 for循环方式 都变为了 进阶for循环 中的常用方式了~

在这里插入图片描述

同时获取index、数据

在这里插入图片描述

step过滤

在这里插入图片描述

多变量、多列表循环 > <

在这里插入图片描述

来源地址:https://blog.csdn.net/qq_20451879/article/details/128580850

--结束END--

本文标题: Kotlin基础入门 - for、forEach 循环

本文链接: https://lsjlt.com/news/375689.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Kotlin基础入门 - for、forEach 循环
    不论身处何方 for循环这种操作都随处可见,鉴于大多数Android开发都是从Java转到Kt的,所以我的思路是从Java的使用习惯来讲一些Kt 的for、forEach 循环方式 基础 for循环惯性 for循环进阶 f...
    99+
    2023-08-19
    Android Kotlin for循环 forEach循环 step 多列表循环
  • 【Python入门篇】——Python中循环语句(for循环的基础语法)
    作者简介: 辭七七,目前大一,正在学习C/C++,Java,Python等 作者主页: 七七的个人主页 文章收录专栏: Python入门,本专栏主要内容为Python的基础语法,Python中的选...
    99+
    2023-09-01
    python 开发语言 numpy
  • Java基础入门篇之如何使用For循环
    这篇文章主要讲解了“Java基础入门篇之如何使用For循环”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java基础入门篇之如何使用For循环”吧! 一、for循环语句在java中...
    99+
    2023-06-15
  • Python基础:for、while循环
    一、While循环 条件控制循环,while后面的condition是真,执行代码块;假,退出循环。可以使用break,强制退出循环。使用else,运行while正常结束时执行的代码块。(break和return退出不执行else)使用co...
    99+
    2023-01-31
    基础 Python
  • python基础之for循环
    For 循环 可以遍历字符串,也可以遍历列表 # for 循环 # 语法特点:遍历操作,依次取集合容器中的几个值 # for 临时变量 in 容器: # 执行代码...
    99+
    2024-04-02
  • Kotlin基础学习-入门篇
    本篇文章来自郭霖大佬的第一行代码中的Kotlin教程,笔者只是在学习Kotlin过程中记录学习过程。 Kotlin系列已更新: Kotlin基础学习-入门篇 Kotlin基础学习-第二篇 Kotli...
    99+
    2023-09-07
    kotlin android
  • Python入门_浅谈for循环、while循环
    Python中有两种循环,分别为:for循环和while循环。 1. for循环 for循环可以用来遍历某一对象(遍历:通俗点说,就是把这个循环中的第一个元素到最后一个元素依次访问一次)。for循环的基本结...
    99+
    2022-06-04
    浅谈 入门 Python
  • 《Python入门到精通》循环语句 while循环,for循环
    「作者主页」:士别三日wyx 「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:小白零基础《Python入门到精通》 循环语句 ...
    99+
    2023-09-04
    python 机器学习 人工智能
  • python入门到实践-for循环
    for循环可以遍历任何序列的项目,比如遍历一个字符串的所有字母或者遍历一个列表中所有元素,还是老规矩,废话不多说直接整代码: #!/usr/bin/env python3 #coding:utf-8 for letter in 'par...
    99+
    2023-01-31
    入门 python
  • Javascrip基础之for循环和数组
    目录循环-forfor循环基本使用退出循环循环嵌套数组数组是什么数组的基本使用遍历数组操作数组总结循环-for for循环基本使用 for循环语法:重复执行代码 好处:把声明起始值、...
    99+
    2024-04-02
  • 详解python基础中的for循环
    目录一、 for 循环二、拓展利用for循环输出字典的值value三、for循环的优势四、for实现累加五、计算10以内偶数和六、计算10以内奇数和总结一、 for 循环 根据变量赋...
    99+
    2024-04-02
  • python基础之while循环、for循环详解及举例
    目录1.while循环1.1Whlie循环的书写方式1.2while循环的格式1.3while循环注意事项1.4while嵌套的格式1.5while练习:计算 1~100 ...
    99+
    2024-04-02
  • python基础中的for循环怎么用
    这篇“python基础中的for循环怎么用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“python基础中的for循环怎么用...
    99+
    2023-06-26
  • Java for循环和foreach循环的性能对比分析
    目录for循环和foreach循环的性能对比普通for循环语法foreach 循环语法for与foreach循环效率比较对于数组来说对于链表来说小结一下吧for循环和foreach循...
    99+
    2024-04-02
  • Python基础教程之循环语句(for、while和嵌套循环)
    循环可以用来重复执行某条语句,直到某个条件得到满足或遍历所有元素。 1 for循环 是for循环,可以把集合数据类型list、tuple、dict、set的元素遍历出来。 (1)对...
    99+
    2024-04-02
  • PHP 中 for 循环和 foreach 循环的性能和可读性
    本文对 PHP 中的 for 循环和 foreach 进行了比较。该比较旨在确定哪个循环具有更快的执行速度和更好的可读性。 for 循环和 foreach 循环与范围 我们在十万次迭代中比较了 ...
    99+
    2024-02-27
  • foreach和for循环的区别有哪些
    这篇文章主要讲解了“foreach和for循环的区别有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“foreach和for循环的区别有哪些”吧!区别:1、for通过索引来循环遍历每一个数...
    99+
    2023-07-04
  • foreach和for循环的区别是什么
    本教程操作环境:windows7系统、javascript1.8.5版、Dell G3电脑。1、for循环 和 forEach的区别(1) for循环是通过 生成 数组的索引下标 循环遍历数组的每一个数据元素forEach是 JavaScr...
    99+
    2023-05-14
    javascript for 循环 foreach 前端开发
  • 详解Java中的增强 for 循环 foreach
    foreach 是 Java 中的一种语法糖,几乎每一种语言都有一些这样的语法糖来方便程序员进行开发,编译期间以特定的字节码或特定的方式来对这些语法进行处理。能够提高性能,并减少代码出错的几率。在 Java 中还有比如 泛型、自动拆箱、自动...
    99+
    2023-05-31
    java 增强for循环 fo
  • Kotlin基础教程之控制流(顺序,分支,循环)
    Kotlin的控制流与其他语言一样,顺序,分支,循环顺序语句就不多说,分支有两种,if-else和when(类似于Java中的switch)if语句:运行结果:Java中的case语句不仅支持整数值,最新的JVM还支持字符串,Kotlin的...
    99+
    2023-05-31
    kotlin 教程 控制流
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作