Java Collection(7)——Iterable接口

1.Iterator接口

1.1 Iterator接口和其他集合類的關系

在這里插入圖片描述
Java集合類中,Iterable接口屬于頂層接口,除Map接口外,其他都實現了Iterable接口,這意味著它們都可以重寫使用Iterable接口中的方法

1.2 Iterable接口簡介

JDK1.7以前,Iterable接口內部只定義了iterator()方法。然而在JDK1.8及以后,又新增了forEach()和spliterator()方法

1.2.1 iterator()

作用:iterator()方法用于返回一個Iterator對象,該對象是一個接口,用于遍歷Iterable集合中的元素。Iterator中的方法是實現Iterable遍歷功能的核心方法

(1)boolean hasNext():判斷集合中是否有還有下一個元素
(2)E next():返回集合中的下一個元素
在這里插入圖片描述
list.iterator()表示返回一個Iterator對象指向list,以下可以看作是遍歷過程
在這里插入圖片描述

(3)default void remove():移除集合中上一次調用next()返回的元素
remove()方法可以在遍歷過程中調用,這表示遍歷和修改元素的操作可以同步進行
在這里插入圖片描述

在JDK1.8及以后,Iterator中又新添了default void forEachRemaining(Consumer<? super E> action)方法。該方法會按順序對迭代器中的剩余的每個元素進行特定的操作
在這里插入圖片描述

public static void main(String[] args) {List<Integer> list = new ArrayList<>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);Iterator<Integer> iterator = list.iterator();//重寫Consumer對象中的accept方法,該方法內部可以對遍歷的元素進行執行的操作//lambda表達式iterator.forEachRemaining(integer -> {integer += 1;System.out.println(integer);});
}

1.2.2 forEach()&foreach()

(1)Iterable接口中的forEach()方法實際上和上述forEachRemaining差不多,該方法會按順序對遍歷的每個元素進行特定的操作
在這里插入圖片描述
我這里forEach方法只是對遍歷的元素進行打印,如果想和上述forEachRemaining一樣,先+1再打印,也是可以做到的
在這里插入圖片描述

(2)foreach又叫做增強型for循環,是一種語法糖,就是一種語法形式(規定吧)。它在內部實際上使用了Iterator來實現遍歷,調用iterator()方法來獲取迭代器,然后使用hasNext()和next()來遍歷集合
在這里插入圖片描述
foreach和迭代器的區別?
答:迭代器可以在遍歷過程中使用remove()方法來刪除元素,并且該刪除操作是可以映射到集合本身的;但是foreach方法不行

1.2.3 spliterator()方法

作用:用于返回Spliterator對象,該對象是一個接口,用于遍歷Iterable集合中的元素。和Iterator對象最大的區別是,使用Spliterator對象中的方法來遍歷集合支持并行處理,這在多線程環境下性能高于使用Iterator來遍歷(但是Spliterator不能保證線程安全性)

(1)boolean tryAdvance(Consumer<? super T>
action):處理當前元素,并移動到下一個元素(類似Iterator中的next方法) (2)Spliterator
trySplit():將當前需要遍歷的集合拆分為兩個部分,返回一個新的Spliterator對象用于處理前半部分,剩下一般由原Spliterator處理

以ArrayList為例:

public class ArrayListParallelSpliteratorExample {public static void main(String[] args) {// 創建一個包含整數的 ArrayListList<Integer> numbers = new ArrayList<>();for (int i = 1; i <= 20; i++) {numbers.add(i);}// 獲取 ArrayList 的 spliteratorOneSpliterator<Integer> spliteratorOne = numbers.spliterator();// 使用 trySplit() 方法拆分 spliteratorTwoSpliterator<Integer> spliteratorTwo = spliteratorOne.trySplit();// 定義一個處理元素的 Consumerjava.util.function.Consumer<Integer> action = (Integer number) ->System.out.println("當前線程: " + Thread.currentThread().getName() + " 處理數字: " + number);// 使用第一個 Spliterator 進行遍歷/*System.out.println("使用第一個 Spliterator 進行遍歷:");spliteratorOne.forEachRemaining(action);// 使用拆分后的 Spliterator 進行遍歷System.out.println("\n使用拆分后的 Spliterator 進行遍歷:");if (spliteratorTwo != null) {spliteratorTwo.forEachRemaining(action);}*///ThreadPoolExecutor executor = new ThreadPoolExecutor(2,2,0,TimeUnit.MINUTES,new ArrayBlockingQueue<>(1),Executors.defaultThreadFactory(),new ThreadPoolExecutor.AbortPolicy());for (int i = 0; i < 2; i++) {executor.execute(() -> {spliteratorOne.forEachRemaining(action);spliteratorTwo.forEachRemaining(action);});}}
}

運行結果:
在這里插入圖片描述

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

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

相關文章

若依微服務版啟動小程序后端

目錄標題 本地啟動&#xff0c;dev對應 nacos里的 xxx-xxx-dev配置文件 本地啟動&#xff0c;dev對應 nacos里的 xxx-xxx-dev配置文件

STM32基礎教程——DMA+ADC多通道

目錄 前言 ?編輯 技術實現 連線圖 代碼實現 技術要點 實驗結果 問題記錄 前言 DMA(Direct Memory Access)直接存儲器存取&#xff0c;用來提供在外設和存儲器 之間或者存儲器和存儲器之間的高速數據傳輸。無需CPU干預&#xff0c;數據可以通過DMA快速地移動&#xff0…

23黑馬產品經理Day01

今天過了一遍23黑馬產品經理的基礎視頻 問題思考維度 抓住核心用戶 為什么需要抓住核心用戶&#xff1f; 主要原因&#xff1a;用戶越來越細分&#xff0c;保持市場競爭力&#xff0c;產品開發推廣更聚焦 做產品為什么要了解用戶&#xff1a;了解用戶的付費點&#xff0c;…

C/C++ 通用代碼模板

? C 語言代碼模板&#xff08;main.c&#xff09; 適用于基礎項目、算法競賽或刷題&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <math.h>// 宏定義區 #define MAX_N 1000 #defi…

【數據結構_7】棧和隊列(上)

一、概念 棧和隊列&#xff0c;也是基于順序表和鏈表實現的 棧是一種特殊的線性表&#xff0c;其只允許在固定的一段進行插入和刪除元素操作。 遵循后進先出的原則 此處所見到的棧&#xff0c;本質上就是一個順序表/鏈表&#xff0c;但是&#xff0c;實在順序表/鏈表的基礎…

git UserInterfaceState.xcuserstate 文件頻繁更新

1> 退出 Xcdoe&#xff0c;打開終端&#xff08;Terminal&#xff09;&#xff0c;進入到你的項目目錄下。 2> 在終端鍵入 git rm --cached <YourProjectName>.xcodeproj/project.xcworkspace/xcuserdata/<YourUsername>.xcuserdatad/UserInterfaceState.x…

【Ai】MCP實戰:手寫 client 和 server [Python版本]

什么是mcp MCP 是一個開放協議&#xff0c;它為應用程序向 LLM 提供上下文的方式進行了標準化。你可以將 MCP 想象成 AI 應用程序的 USB-C 接口。就像 USB-C 為設備連接各種外設和配件提供了標準化的方式一樣&#xff0c;MCP 為 AI 模型連接各種數據源和工具提供了標準化的接口…

ESP8266/32作為AVR編程器(ISP programmer)的使用介紹

ESP8266作為AVR編程器( ISP programmer)的使用介紹 &#x1f33f;ESP8266自帶庫例程&#xff1a;https://github.com/esp8266/Arduino/tree/master/libraries/ESP8266AVRISP&#x1f4cd;支持ESP8266/32的ESP_AVRISP其它開源工程&#xff08;個人沒有再去驗證&#xff09;&…

08-JVM 面試題-mk

文章目錄 1.JVM 的各部分組成2.運行時數據區2.1.什么是程序計數器?2.2.你能給我詳細的介紹Java堆嗎?2.3.能不能解釋一下方法區?2.3.1常量池2.3.2.運行時常量池2.4.什么是虛擬機棧?2.4.1.垃圾回收是否涉及棧內存?2.4.2.棧內存分配越大越好嗎?2.4.3.方法內的局部變量是否線…

Vue3 nextTick

nextTick 是 Vue 中非常重要的一個 API&#xff0c;它允許你在 DOM 更新周期后執行延遲回調。 核心源碼位置 Vue3 的 nextTick 實現主要在 packages/runtime-core/src/scheduler.ts 文件中。 基本實現 const resolvedPromise Promise.resolve() as Promise<any> let …

DISCO:利用大型語言模型提取反事實

DISCO: Distilling Counterfactuals with Large Language Models - ACL Anthologyhttps://aclanthology.org/2023.acl-long.302/ 1. 概述 盡管在自然語言處理(NLP)領域針對各種推理任務取得了巨大進展(Wang 等, 2018, 2019a;Xu 等, 2020),但數據集偏差仍然是構建魯棒模型…

【Django】框架-路由系統核心概念解析

1. 最基本路由關系 路由是URL地址與處理邏輯&#xff08;視圖函數&#xff09;的對應關系。 本質&#xff1a;將用戶請求的URL路徑映射到具體的處理程序&#xff08;如Django視圖函數&#xff09;。 示例&#xff1a; # urls.py urlpatterns [ path(home/, views.home_…

理解 results = model(source, stream=True) 的工作原理和優勢

1. 核心概念解析 (1) streamTrue 的作用 生成器模式&#xff1a;當處理視頻或圖像序列時&#xff0c;streamTrue 會將結果包裝成一個 生成器&#xff08;Generator&#xff09;&#xff0c;逐幀生成 Results 對象&#xff0c;而不是一次性返回所有結果。內存優化&#xff1a;…

重新定義“邊緣”:邊緣計算如何重塑人類與數據的關系

在數字化浪潮中&#xff0c;云計算曾是科技界的寵兒&#xff0c;但如今&#xff0c;邊緣計算正在悄然改變游戲規則。它不僅是一種技術進步&#xff0c;更是對人類與數據關系的一次深刻反思。本文將探討邊緣計算如何從“中心化”走向“分布式”&#xff0c;以及它如何在效率、隱…

MCP 協議知識分享

MCP 協議知識分享 一、MCP 協議概述1.1 定義與背景1.2 核心價值1.3 與傳統 API 的對比 二、技術架構與工作原理2.1 核心組件2.2 通信機制2.3 典型工作流程 三、關鍵技術與應用場景3.1 核心技術3.2 典型應用場景 四、與微軟技術的集成4.1 Azure OpenAI 服務4.2 Playwright MCP 服…

策略模式實現 Bean 注入時怎么知道具體注入的是哪個 Bean?

Autowire Resource 的區別 1.來源不同&#xff1a;其中 Autowire 是 Spring2.5 定義的注解&#xff0c;而 Resource 是 Java 定義的注解 2.依賴查找的順序不同&#xff1a; 依賴注入的功能&#xff0c;是通過先在 Spring IoC 容器中查找對象&#xff0c;再將對象注入引入到當…

Linux》》bash 、sh 執行腳本

通常使用shell去運行腳本&#xff0c;兩種方法 》bash xxx.sh 或 bash “xxx.sh” 、sh xxx.sh 或 sh “xxx.sh” 》bash -c “cmd string” 引號不能省略 我們知道 -c 的意思是 command&#xff0c;所以 bash -c 或 sh -c 后面應該跟一個 command。

【解析】ReentrantLock鎖、Syschronized鎖面試點解析

面試官提問 ● 公平鎖與非公平鎖的區別是什么&#xff1f; ● 什么是可重入鎖&#xff1f; ● 什么是死鎖&#xff0c;怎樣避免死鎖&#xff1f; ● ReentrantLock與Syschronized實現原理是什么&#xff1f;兩者有什么區別&#xff1f; ● 請說明ReentrantLock獲取鎖與釋放…

04.Python代碼NumPy-通過索引或切片來訪問和修改

04.Python代碼NumPy-通過索引或切片來訪問和修改 提示&#xff1a;幫幫志會陸續更新非常多的IT技術知識&#xff0c;希望分享的內容對您有用。本章分享的是Python基礎語法。前后每一小節的內容是存在的有&#xff1a;學習and理解的關聯性&#xff0c;希望對您有用~ python語法…

跨平臺數據采集如何解決不同平臺之間的數據兼容性問題?

在數字化時代&#xff0c;企業越來越依賴多個信息系統來管理業務&#xff0c;例如ERP&#xff08;企業資源計劃&#xff09;、CRM&#xff08;客戶關系管理&#xff09;、財務管理系統、電商平臺等。然而&#xff0c;在進行跨平臺數據采集時&#xff0c;不同系統之間的數據格式…