Java8 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)
需要注意的是:在流中必須使用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
參考
相關推薦
Java8 Stream流遍歷 如何使用索引
1. 問題來源 Java8的Stream流為我們的遍歷集合帶來了方便,基本可以取代for迴圈了。但是有一些情況需要知道當前遍歷的索引,使用for迴圈當然可以輕易獲得,但使用stream就很難了。 比如下面這個情況: 有一個集合list,裡面儲存的是引用型別。 使
java8--stream流API
生成資料流 使用Java8,Collection 介面有兩個方法來生成流。 stream() -返回順序流考慮集合作為其源。 parallelStream() - 返回並行資料流考慮集合作為其源 流/Stream是在JAV
flask的jinja2過濾器使用:遍歷索引指定標籤class屬性,實現樣式變化
在flask專案中實現上圖效果,採用使用自定義過濾器的形式對 span 標籤的 class 指定。 1、定義過濾器 # common.py def do_index_class(index): """自定義過濾器""" if index == 0:
JAVA8 Stream流
什麼是Stream 流(Stream) 到底是什麼呢? 是資料渠道,用於操作資料來源(集合、陣列等)所生成的元素序列。“集合講的是資料,流講的是計算!” 注意: ①Stream 自己不會儲存元素。 ②Stream 不會改變源物件。相反,他們會返回一個持有結果的新
java8 Stream流操作介紹
流操作在本人接觸到的部分,都是處理集合容器Collection,加入流操作主要是為了函數語言程式設計,在很大程度上可以簡化程式碼 簡潔的程式碼處理複雜邏輯這是每個程式猿的追求,廢話不多說,開始介紹 使用Stream基本步驟 1. 建立Stream; 2. 轉換Stream
java8--Stream流
轉載自:冰橘檸檬 https://blog.csdn.net/weixin_39124328/article/details/83065123 為什麼需要 Stream Java8中的stream與 java.io 包裡的 InputStream 和 OutputStream 是完全不同
ElasticSearch通過Scroll方式遍歷索引(Python程式碼)
當我們要查詢的資料量過大的時候,用es的from+size的方式會報錯,會提示你from+size不能大於10000那麼可以用es的scroll方式,實際是一種深度分頁機制直接上程式碼:#-*- cod
java IO流遍歷檔案
import java.io.File; public class 遍歷檔案 { public static void listfile(File file){ if(file!=null){
Java8--stream流操作對List、List的過濾處理經驗分享
應用場景(一): 1.對list<map>中map中某個指定的key的value的去重,得到新的list:去除了重複出現指定key的value值得map示例: 要求:過濾掉電話相同的map List
Java8 集合的遍歷
集合的使用方法 package com.lgx.jdk8.part01; import java.util.Arrays; import java.util.List; import java.util.function.Consumer; /** * JDK8集合遍
俠說java8--Stream流操作學習筆記,都在這裡了
前言 首次接觸到Stream的時候以為它是和InputStream、OutputStream這樣的輸入輸出流的統稱。 流和集合的前世今生 概念的差異 在開發中,我們使用最多的類庫之一就是集合。集合是一種記憶體中的資料結構,用來儲存物件資料,集合中的每個元素都得先算出來才能新增到集合中,相比之下: 集合用特
Java8——Stream流
`Stream`是資料渠道,用於操作集合、陣列等生成的元素序列。 `Stream`操作的三個步驟: - 建立Stream - 中間操作 - 終止操作 ## 一、獲取stream的四種方式 1. 通過`collection`系列集合的`stream()`或`parallelStream()`獲取。
List集合去重的一些方法(常規遍歷、Set去重、java8 stream去重、重寫equals和hashCode方法)
利用 src false java8 see eat 基本 style ceo 1. 常規元素去重 碰到List去重的問題,除了遍歷去重,我們常常想到利用Set集合不允許重復元素的特點,通過List和Set互轉,來去掉重復元素。 // 遍歷後判斷賦給另一個list集
java-IO流(File對象-深度遍歷指定目錄下的文件夾和文件)
true file turn ren 文件夾 int tsa http absolut 需求:遍歷這個樹狀結構 File(String pathname) ‘\\‘為了轉義‘\‘ // 通過抽象路徑pathname 創建一個新的文件或者目錄 Fil
PHP二維索引數組的2種遍歷方式
php 數組 二維數組 索引數組 數組遍歷 二維索引數組的遍歷方式,話不多說,直接看代碼。實例一、<?php$arr = array(//定義外層數組 array(1,‘高某‘,‘A公司‘,‘北京市‘,‘(010)987654321‘,‘[email protect
Java8新特性之forEach遍歷
clas 分享圖片 pos 分享 inf div post for AC 參考文章: https://www.cnblogs.com/billyu/p/6118008.htmlJava8新特性之forEach遍歷
js中遍歷註冊事件時索引怎麽獲取
遍歷註冊單擊事件 索引註意:這種寫法,是有問題的。註冊事件是在頁面加載完畢以後就完成了,但此時並沒有觸發事件。事件觸發是由用戶在頁面上點擊時才會觸發,所以說當用戶點擊時,才會執行事件處理函數,那麽此時的i已經變成了4,最後最終彈出來的結果是i+1,也就是5,而且每一個元素的彈出來的結果都是5。此時的做法應該是
(3.8)存儲引擎--索引的遍歷與維護
數據 影響 類型 值範圍 數據量 src 分享圖片 重建 回滾 一、遍歷 索引樹的每個節點都是一個頁面。 索引樹有三種類型的節點:根節點、中間節點、葉子節點。 (1) 根節點與中間節點一樣,只包含下一層節點的入口值與入口指針,它們稱為索引節點; (2) 葉子節點包含要遍歷的
struts標籤iterator利用索引遍歷指定個數的元素
只遍歷出前四個元素: < s:iterator value = "#request.pageList.datalist" status = "st" &g
java8之stream流的基本操作
一、stream流簡介 Stream流是資料渠道,用於操作資料來源(集合、陣列等)所生成的元素序列。 Stream的優點:宣告性,可複合,可並行。這三個特性使得stream操作更簡潔,更靈活,更高效。 Stream的操作有兩個特點:可以多個操作連結起來執行,內部迭代。 Stream可分為並