1. 程式人生 > >Java8 Stream流遍歷 如何使用索引

Java8 Stream流遍歷 如何使用索引

1. 問題來源

Java8Stream流為我們的遍歷集合帶來了方便,基本可以取代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

  1. 那麼究竟下面兩者有什麼區別呢?
Stream<Integer> // 包裝型別
IntStream	//基本型別

所以對於mapToObjmapToInt也是同樣的
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

  1. 上面兩個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. 總結

  1. 使用IntStream可以靈活的操作物件和獲取索引。
  2. map不進行包裝和基本型別的轉化,mapToObj是基本轉為包裝,mapToInt是包裝轉為基本。

END

參考

相關推薦

Java8 Stream 如何使用索引

1. 問題來源 Java8的Stream流為我們的遍歷集合帶來了方便,基本可以取代for迴圈了。但是有一些情況需要知道當前遍歷的索引,使用for迴圈當然可以輕易獲得,但使用stream就很難了。 比如下面這個情況: 有一個集合list,裡面儲存的是引用型別。 使

java8--streamAPI

生成資料流 使用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

java8stream的基本操作

一、stream流簡介 Stream流是資料渠道,用於操作資料來源(集合、陣列等)所生成的元素序列。 Stream的優點:宣告性,可複合,可並行。這三個特性使得stream操作更簡潔,更靈活,更高效。 Stream的操作有兩個特點:可以多個操作連結起來執行,內部迭代。 Stream可分為並