Kotlin中 for in 是有序的嗎?forEach呢?

我們要遍歷一個數組、一個列表,經常會用到kotlin的 for in 語法,但是 for in 是不是有序的呢?forEach是不是有序的呢?這就需要看一下它們的本質了。

數組的 for in

// 調用:
val arr = arrayOf(1, 2, 3)
for (ele in arr) {println(ele)
}

反編譯成Java是個什么東西呢?

Integer[] arr = new Integer[]{1, 2, 3};
Integer[] var4 = arr;
int var5 = arr.length;for(int var3 = 0; var3 < var5; ++var3) {int ele = var4[var3];System.out.println(ele);
}

總結:從Java代碼可以看出,實際就是一個普通的for循環,是從下標0開始遍歷到結束的,所以是有序的。

列表的 for in

// 調用:
val list = listOf(1, 2, 3)
for (ele in list) {println(ele)
}

反編譯成Java:

List list = CollectionsKt.listOf(new Integer[]{1, 2, 3});
Iterator var3 = list.iterator();while(var3.hasNext()) {int ele = ((Number)var3.next()).intValue();System.out.println(ele);
}

可以看出列表的for in是通過iterator實現的,和數組不一樣,那這個iterator遍歷是否是有序的呢?首先我們要知道這個iterator怎么來的:

// iterator 是通過調用 list.iterator() 得到的,那么這個list又是什么呢?
Iterator var3 = list.iterator();// list
List list = CollectionsKt.listOf(new Integer[]{1, 2, 3});// list是通過數組elements.asList()得到的
public fun <T> listOf(vararg elements: T): List<T> = if (elements.size > 0) elements.asList() else emptyList()// 這里有個expect,找到對應的actual
public expect fun <T> Array<out T>.asList(): List<T>// 對應的actual
public actual fun <T> Array<out T>.asList(): List<T> {return ArraysUtilJVM.asList(this)
}// 最終調用了Arrays.asList(array)
class ArraysUtilJVM {static <T> List<T> asList(T[] array) {return Arrays.asList(array);}
}public class Arrays {// 從這里看到最終拿到的list是 Arrays 類中的 ArrayList// 然后我們找到里面的 iterator() 方法public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}private static class ArrayList<E> extends AbstractList<E>implements RandomAccess, java.io.Serializable{private final E[] a;@Overridepublic Iterator<E> iterator() {// 最終得到的iterator是ArrayItr// 這里的a是一個數組,也就是我們一開始傳進來的1,2,3return new ArrayItr<>(a);}}private static class ArrayItr<E> implements Iterator<E> {private int cursor;private final E[] a;ArrayItr(E[] a) {this.a = a;}@Overridepublic boolean hasNext() {return cursor < a.length;}@Overridepublic E next() {int i = cursor;if (i >= a.length) {throw new NoSuchElementException();}cursor = i + 1;return a[i];}}
}

總結:列表的for in是通過iterator實現的,這個iterator是ArrayItr,從里面的next()方法可以看出,這也是有序的,從cursor開始,cursor默認是0,也就是從下標0開始遍歷。
注:這里只是分析了Arrays.ArrayList的iterator,具體的集合類需要具體分析,比如ArrayList、LinkedList等,不過從正常思維來看,iterator是一個迭代器,就應該有序的把數據一個一個丟出來。

數組的 forEach

// 調用:
val arr = arrayOf(1, 2, 3)
arr.forEach {println(it)
}// 點進去forEach看:
// 其實也是調用了for in,所以也是有序的。
public inline fun <T> Array<out T>.forEach(action: (T) -> Unit): Unit {for (element in this) action(element)
}

列表的 forEach

// 調用:
val list = listOf(1, 2, 3)
list.forEach {println(it)
}// 點進去forEach看:
// 其實也是調用了for in,所以也是有序的。
public inline fun <T> Iterable<T>.forEach(action: (T) -> Unit): Unit {for (element in this) action(element)
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/164438.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/164438.shtml
英文地址,請注明出處:http://en.pswp.cn/news/164438.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

安卓現代化開發系列——從生命周期到Lifecycle

由于安卓已經誕生快二十載&#xff0c;其最初的開發思想與現代的開發思想已經大相徑庭&#xff0c;特別是Jetpack庫誕生之后&#xff0c;項目中存在著新老思想混雜的情況&#xff0c;讓許多的新手老手都措手不及&#xff0c;項目大步向屎山邁進。為了解決這個問題&#xff0c;開…

P6 C++控制流語句(continue, break, return)

前言 今天我們講的是控制流語句&#xff0c;本期內容是上期課程的延續。 控制流語句一般與循環語句一起工作&#xff0c;它們讓我們可以更好的控制這些循環的實際運行。 我們有三個主要的控制流語句可以使用&#xff0c;continue 、break 和 return&#xff0c;它們有不同的…

Python 訂閱 image_transport 壓縮后的深度圖 compressedDepth

image_transport 是ros的一個圖像處理工具,可以很方便地進行圖像數據的壓縮,可惜它目前并不支持python 當你如下安裝了image_transport及其plugin后 sudo apt install ros-foxy-image-transport*運行 ros2 run image_transport list_transports可看到如下內容 Declared tr…

打印樓梯,同時在樓梯上方打印兩個笑臉。

#include<stdio.h> int main() { int i,j; printf("\1\1\n"); /*輸出兩個笑臉*/ for(i1;i<11;i) { for(j1;j<i;j) printf("%c%c",219,219); printf("\n"); } return 0; }

【C++】POCO學習總結(五):功能介紹

【C】郭老二博文之&#xff1a;C目錄 1、POCO 簡介 github&#xff1a;https://github.com/pocoproject/poco 官網&#xff1a;https://pocoproject.org/index.html POCO第一個版本于 2005 年 2 月發布 POCO完全免費&#xff1a;POCO C 庫根據 Boost 軟件許可證獲得許可。非…

QMI8658A(6軸)-EVB 評估板-使用說明書

QMI8658A6<6軸>-EVB 評估板-使用說明書 0.前言 1.硬件準備 1.1 I2C 接口 1.2 USART 接口 1.3 引腳序號功能定義 2.程序運行 0.前言 【相關博文】 【QMI8658 - 姿態傳感器學習筆記 - Ⅰ】 【QMI8658 - 姿態傳感器學習筆記 - Ⅱ】 【QMI8658 - 姿態傳感器學習…

基于單片機的光伏發電并網系統設計(論文+源碼)

1.系統設計 片作為主控制器。由于太陽能板本身的能量輸出受到負載影響&#xff0c;因此需要在太陽能板后面加入一級DC/DC電路&#xff0c;來實現最大功率跟蹤&#xff0c;以提高整個系統的效率。接著&#xff0c;由于光伏逆變器需要產生220V的交流電給居民使用&#xff0c;因此…

[MySQL] MySQL 表的增刪查改

本篇文章對mysql表的增刪查改進行了詳細的舉例說明解釋。對表的增刪查改簡稱CRUD : Create(創建), Retrieve(讀取)&#xff0c;Update(更新)&#xff0c;Delete&#xff08;刪除&#xff09;。其中重點是對查詢select語句進行了詳細解釋&#xff0c;并且通過多個實際例子來幫助…

香港科技大學廣州|先進材料學域博士招生宣講會—華中科技大學大學專場!!!(暨全額獎學金政策)

“跨學科融合創新&#xff0c;引領新興與未來行業的突破與發展——先進材料學域” 世界一流的新型可持續材料創新研究 夯實的先進材料領域國際學術影響力 教授親臨現場&#xff0c;面對面答疑解惑助攻申請&#xff01; 一經錄取&#xff0c;享全額獎學金1.5萬/月&#xff01; …

【性能優化】JVM調優與寫出JVM友好高效的代碼

&#x1f4eb;作者簡介&#xff1a;小明java問道之路&#xff0c;2022年度博客之星全國TOP3&#xff0c;專注于后端、中間件、計算機底層、架構設計演進與穩定性建設優化&#xff0c;文章內容兼具廣度、深度、大廠技術方案&#xff0c;對待技術喜歡推理加驗證&#xff0c;就職于…

面試:Kafka相關問題

文章目錄 簡單介紹kafkakafka應用場景為什么需要zookeeperZookeeper 對于 Kafka 的作用是什么&#xff1f;kafka高效的原因kafka的特點kafka的核心組成Kafka中的Topic和Partition有什么關系&#xff1f;Kafka的消費消息是如何傳遞的&#xff1f;Kafka 的多副本機制了解嗎&#…

STM32:基本定時器原理和定時程序

一、初識定時器TIM 定時器就是計數器&#xff0c;定時器的作用就是設置一個時間&#xff0c;然后時間到后就會通過中斷等方式通知STM32執行某些程序。定時器除了可以實現普通的定時功能&#xff0c;還可以實現捕獲脈沖寬度&#xff0c;計算PWM占空比&#xff0c;輸出PWM波形&am…

Vue3 + Vite + TSX + vue3-ace-editor 踩坑

前言 由于 ace-editor 官網并沒有提供各個前端框架Vue&#xff0c;React&#xff0c;Angular的直接使用的適配版本&#xff0c; 所以本次使用的vue3-ace-editor 是個人開源者維護的版本&#xff0c;原生是支持 SFC 模版用的&#xff0c;由于我這里習慣使用 JSX 或 TSX的方式&a…

【03】ES6:解構賦值

一、數組的解構賦值 ES6 允許按照一定模式&#xff0c;從數組和對象中提取值&#xff0c;對變量進行賦值&#xff0c;這被稱為解構&#xff08;Destructuring&#xff09;。 1、基本使用 遵循 “模式匹配” &#xff0c;索引值相同的完成賦值 // 為變量賦值&#xff0c;只能…

Centos7 Python環境和yum修復

1、刪除現有殘余包 [rootlocalhost ]# rpm -qa|grep python|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# rpm -qa|grep yum|xargs rpm -ev --allmatches --nodeps[rootlocalhost ]# whereis python |xargs rm -frv[rootlocalhost ]# whereis python ##驗證清除&…

mybatis注解方式動態標簽時有特殊符號,出現元素內容必須由格式正確的字符數據或標記組成

原始代碼demo Select("SELECT COUNT(1) FROM AAAA WHERE name #{nage} AND age< 4") public Integer sumXxxxx(String nage, String age);現需求改為nage可以為空&#xff0c;因此使用了動態拼接 Select("<script> SELECT COUNT(1) FROM AAAA WHERE …

SWT/Jface(2): 表格的編輯

前言 上節說到, 創建和渲染表格需要如下幾個步驟: 接收源數據數組(也可以是單個對象或者其他集合類型): TableViewer.setInput(Object)渲染接收的數據 渲染表頭: TableViewer.setLabelProvider(IBaseLabelProvider)渲染內容: TableViewer.setContentProvider(IContentProvide…

java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx

windows系統下連接hdfs進行操作時&#xff0c;上來就出現java.lang.IllegalArgumentException: java.net.UnknownHostException: xxx java.lang.IllegalArgumentException: java.net.UnknownHostException: liujianat org.apache.hadoop.security.SecurityUtil.buildTokenServ…

Keil Vision5—新建工程project

注意&#xff1a;創建的工程目錄必須是純英文目錄 目錄 1.開始配置 2.為該路徑下新建個文件夾 3.選擇器件 4.工程配置 4.右擊魔術棒&#xff0c;設置參數 ?編輯 &#xff08;1&#xff09;target配置 &#xff08;2&#xff09;output配置 &#xff08;3&#xff09;c…

字符串結尾空格比較相關參數BLANK_PAD_MODE(DM8:達夢數據庫)

DM8:達夢數據庫 字符串結尾空格比較相關參數BLANK_PAD_MODE 環境介紹1 BLANK_PAD_MODE01.1 初始化數據庫1.2 創建測試表 T0 2 BLANK_PAD_MODE12.1 初始化數據庫2.2 創建測試表 T1 3 BLANK_PAD_MODE只對字段varchar類型生效3.1 BLANK_PAD_MODE 對char 類型對比無效3.2 在兩個數據…