[轉載] Java8 Stream流遍歷 如何使用索引

參考鏈接: Java 8中迭代帶有索引的流Stream

1. 問題來源?

Java8的Stream流為我們的遍歷集合帶來了方便,基本可以取代for循環了。但是有一些情況需要知道當前遍歷的索引,使用for循環當然可以輕易獲得,但使用stream就很難了。 比如下面這個情況: 有一個集合list,里面存儲的是引用類型。 使用for循環可以輕易的操作索引i?

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

? ? System.out.println(list.get(i));

? ? System.out.println(i);

}

?

使用Stream流遍歷list如下,其中handle是一個方法,想在handle方法里面拿到當前索引是很困難的。?

list.stream().map(t -> handle(t)).collect(Collectors.toList());

?

2. 解決辦法?

使用IntStream流來構造一個Int類型的流出來,然后遍歷這個Int的流,list中的對象可以通過get方法來取。具體解決代碼如下:?

IntStream.range(0, lists.size())

? ? ? ? ?.mapToObj(i -> handle(lists.get(i), i))

? ? ? ? ?.collect(Collectors.toList());

?

可以看到代碼里的這一句:handle(lists.get(i), i),這樣就成功的把索引帶入到了handle方法中。?

需要注意的是:在流中必須使用mapToObj,而不能使用map映射?

3. map映射和mapToObj的區別?

首先Stream流下面的類包含了IntStream, LongStream, DoubleStream等?

那么究竟下面兩者有什么區別呢??

Stream<Integer> // 包裝類型

IntStream? ? //基本類型

?

所以對于mapToObj和mapToInt也是同樣的 mapToObj 方法主要是將Stream中的元素進行裝箱操作, 轉換成一個引用類型的值。 mapToInt 方法是將Stream中的 元素轉換成基本類型int。 比如下面的例子?

Stream s = IntStream.of(4, 5, 6).mapToObj(e -> e); //mapToObj method is needed

IntStream is = Stream.of(4, 5, 6).mapToInt(e -> e); //mapToInt method is needed

?

可以看到Stream是包裝類型,所以想要把IntStream基本類型流轉化成包裝類型,就需要使用mapToObj。?

上面兩個mapToObj和mapToInt是進行類型的轉化,那么map的作用呢? map不進行類型轉化,如果原來流中是基本類型,map映射完應當還是基本類型,如果原來是包裝類型,映射完應當還是包裝類型。 比如下面這個例子:?

IntStream.of(1, 2, 3, 4, 5, 6, 7).map(elem -> elem * 10).forEach(System.out::println);

?

這也就解釋了,為什么上面的第二節解決辦法里面,用map不行,而需要mapToObj,因為那里做了一個基本類型到包裝類型的轉化?

3. 總結?

使用IntStream可以靈活的操作對象和獲取索引。map不進行包裝和基本類型的轉化,mapToObj是基本轉為包裝,mapToInt是包裝轉為基本。?

END?

參考?

Java 8之基本類型優化 Java Stream difference between map and mapToObj How to get element index when using a stream to traverse a list?

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

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

相關文章

Jquery簡單的右側浮動菜單

今天有空稍微看了下Jquery動畫函數animate這個方法&#xff0c;發現可以用這個方法來做下簡單的右側浮動菜單 因為經常做淘寶頁面時候會碰到這樣的效果 以前都是用人家的javascript組件代碼 發現老是用人家也不好&#xff0c;所以今天有空用jqeury中的animate這個方法寫了一個簡…

[轉載] Java8-Stream API 詳解

參考鏈接&#xff1a; 如何在Java 8中從Stream獲取ArrayList 摘要 Stream 作為 Java 8 的一大亮點&#xff0c;它與 java.io 包里的 InputStream 和 OutputStream 是完全不同的概念。它也不同于 StAX 對 XML 解析的 Stream&#xff0c;也不是 Amazon Kinesis 對大數據實時處理…

在Microsoft System Center中利用您的現有投資管理VMware--Veeam MP v6.5

在 Microsoft System Center 中利用您的現有投資管理 VMware VeeamManagement Pack (MP) v6.5 適用于物理、虛擬和備份基礎架構的單一的虛擬管理平臺 前段時間介紹了Veeam Management Pack (MP) v6.0產品&#xff0c;昨天發布了新版本VeeamManagement Pack (MP) v6.5&#xff0…

[轉載] Java關鍵字(Java 8版本)

參考鏈接&#xff1a; 所有Java關鍵字列表 定義 被Java語言賦予了特殊含義&#xff0c;用作專門用途的字符串&#xff08;單詞&#xff09;&#xff0c;這些關鍵字不能用于常量、變量、和任何標識符的名稱。 Java關鍵字(Java 8版本) Java關鍵字(Java 8 以后版本) 注意事…

uiw 1.2.17 發布,基于 React 16 的組件庫

發布&#xff0c; 高品質的UI工具包&#xff0c;React 16的組件庫。 文檔網站&#xff1a;uiw-react.github.io開源倉庫&#xff1a;github.com/uiw-react/u… 更新內容&#xff1a; ? 修復沒有代碼檢測文件匹配*.css。 5712887 ? 添加 .editorconfig 文件. d82dabf ? 給測試…

[轉載] Java中this和super關鍵字分別是什么意思

參考鏈接&#xff1a; Java中的Super關鍵字 this和super關鍵字 this是自身的一個對象&#xff0c;代表對象本身可以理解為指代當前的對象&#xff0c;它可以調用當前對象的屬性、方法和構造方法&#xff0c;一般情況下可以省略&#xff0c;必須使用this的地方是區分出現名字重…

SpringMVC注解HelloWorld

今天整理一下SpringMVC注解 歡迎拍磚 RequestMapping RequestMapping是一個用來處理請求地址映射的注解&#xff0c;可用于類或方法上。用于類上&#xff0c;表示類中的所有響應請求的方法都是以該地址作為父路徑。 RequestMapping注解有六個屬性&#xff0c;下面我們把她分成三…

mysql問答匯集

問:A&#xff0c;B兩臺mysql實現主從復制,A提供寫&#xff0c;B提供讀,那既然B要同步A&#xff0c;當A更新數據的時候&#xff0c;B不也一樣要更新嗎&#xff1f;那B不還是沒有實現負載減輕嗎&#xff1f;還有能通過MYSQL proxy實現3臺mysq均衡l嗎&#xff1f;一臺寫&#xff0…

自制 移動端 純原生 Slider滑動插件

在Google搜關鍵字“slider”或“swiper”能找到一大堆相關插件&#xff0c;自己造輪子是為了能更好的理解其中的原理。 給這個插件取名為“veSlider”是指“very easy slider”非常簡單的一個滑動插件。 這只是個半成品&#xff0c;僅僅實現了手指滑動、自動輪播、跳轉等基本功…

ISA Server 2006 部署步驟

ISA Server 2006 部署步驟 Posted by 尹揆 在這里先把ISA2006的安裝步驟給大家貼出來,后面陸續會有一些配置及日常的應用,希望大家多多指教!呵呵.ISA功能的強大自然不用多說了,一句話只要能想到它就能做到!放入光盤出現在我們面前還是其人性化的界面點默認的下一步吧接受協議序…

ELK 分析 nginx access 日志

注意&#xff1a;修改配置后建議重新創建index 1、nginx 日志文件格式 123log_format elk "$http_clientip | $http_x_forwarded_for | $time_local | $request | $status | $body_bytes_sent | ""$request_body | $content_length | $http_referer | $http_use…

mysql將查詢數據另存

1.查詢mysql的存儲執行目錄&#xff08;secure-file-priv是指定文件夾作為導出文件存放的地方&#xff09;所以需要查詢以下&#xff0c;不然會報1290錯誤 show variables like %secure%;2.查詢并轉存 SELECT * into outfile C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\zo…

重新撿起flask(三)

記一次bug調試。 本來以為模板這一章可以很快的過掉的&#xff0c;剛剛寫完的2其實只剩下個flask-moment時間庫了&#xff0c;之前早就做過&#xff0c;記得很簡單&#xff0c;本來說只要敲一下代碼就結束&#xff0c;沒想到&#xff0c;踩坑里去了。 調試bug嗎&#xff0c;我想…

遠程服務器部署spring boot 項目(centos7為例)

1.打包項目&#xff08;可以是jar包&#xff0c;也可以是war包&#xff09;以jar包為例&#xff08;用eclipse打包&#xff09;&#xff1a;1.項目目錄右擊--debug as&#xff08;run as&#xff09;--maven build&#xff0c;然后輸入package&#xff0c;點擊debug&#xff0c…

SIN的服務器配置

統計了新加坡服務器中IBM XIV存儲掛載的主機列表。 對于vmware虛擬機來說&#xff0c;是這么組成的&#xff1a; 存儲分了多個lun&#xff0c;在os側叫做data store&#xff0c;多個datastore掛給多個物理機&#xff0c;物理機(安裝了esxi軟件)稱為ESXI主機&#xff0c;多個ESX…

sklearn的train_test_split

sklearn的train_test_split train_test_split函數用于將矩陣隨機劃分為訓練子集和測試子集&#xff0c;并返回劃分好的訓練集測試集樣本和訓練集測試集標簽。 格式&#xff1a; X_train,X_test, y_train, y_test cross_validation.train_test_split(train_data,train_target,…

textmate bundle for jquery

使用這個bundle的例子:鍵入ready然后按tab就會生成下面的代碼:$(document).ready(function() { }); 其中第二行被選中,這時在里面編寫jquery代碼即可. 如果要查看某個function的官方文檔的話可以在鍵入的function之后使用快捷鍵ctrlh 查看. 關于bundle的下載 這里是一個textmat…

sklearn機器學習實例

原創網址&#xff1a;https://blog.csdn.net/qq_27150893/article/details/80169736 sklearn是非常流行的機器學習庫&#xff0c;實現了很多的機器學習模型。官網&#xff1a;http://scikit-learn.org/stable/ 里面有全面的實例和模型參數講解&#xff0c;用到哪個模型就去官…

CSVDE批量導入域用戶

CSVDE批量導入用戶 你可以使用Csvde格式的文件在活動目錄中創建用戶帳號和其他類型的帳號。但你不能使用Csvde刪除活動目錄中的對象。 使用Csvde命令行工具創建用戶帳號&#xff0c;采用下列步驟&#xff1a; 1. 創建Csvde輸入文件。文件應包含下列信息。 屬性行&#xff1a;這…

sklearn 實例

http://scikit-learn.org/stable/auto_examples/index.html sklearn例子大全 https://deeplearning4j.org/mnist-for-beginners deeplearning官網