成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Stream的分類,執行流程和各種創建方式

開發 前端
stream()方法創建的是【串行流】也可以叫【順序流】,由主線程按順序對流執行操作,而 parallelStream()方法創建的是【并行流】,內部以多線程并行執行的方式對流進行操作,但前提是流中的數據處理沒有順序要求。

本文章為系列文章,上一篇《??Stream案例體驗??》通過豐富的案例感受了Stream的便利,本篇主要講解:

  • Stream的運行流程,結合本篇和上一篇案例體會
  • Stream的創建方式
  • Stream的操作分類
  • 串行流和并行流區別

Stream運行流程

這里通過一個運費案例,通過 【代碼實現】 +【 圖解】解釋清楚Stream計算數據時的流程!

需求:獲取運單價格大于 5000元 的運單編號

分析:

  • 創建運單數據
  • 通過集合的stream方法創建流
  • 再通過調用流對象的 filter方法過濾出需要的數據【中間操作】
  • 再通過流對象的map方法獲取想要的字段數據【中間操作】
  • 在通過collect方法將流對象轉換為集合,終止流【終止操作】

代碼實現:

運單類可直接復用 《??Stream案例體驗??》一篇

import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;

public class WaybillMain {

private static List<Waybill> waybills = new ArrayList<>();

static {
// 創建數據
waybills.add(new Waybill(1L,"Y11111111111",new BigDecimal(1000),"鋼材",new BigDecimal(200),"上海市"));
waybills.add(new Waybill(2L,"Y22222222222",new BigDecimal(2000),"鋼材",new BigDecimal(300),"鄭州市"));
waybills.add(new Waybill(3L,"Y33333333333",new BigDecimal(3000),"水泥",new BigDecimal(300),"北京市"));
waybills.add(new Waybill(4L,"Y44444444444",new BigDecimal(4000),"水泥",new BigDecimal(400),"廣州市"));
waybills.add(new Waybill(5L,"Y55555555555",new BigDecimal(5000),"沙子",new BigDecimal(500),"上海市"));
waybills.add(new Waybill(6L,"Y66666666666",new BigDecimal(6000),"板材",new BigDecimal(500),"深圳市"));
waybills.add(new Waybill(7L,"Y77777777777",new BigDecimal(7000),"蔬菜",new BigDecimal(500),"杭州市"));
}

public static void main(String[] args){
// 1、獲取運費大于5000的運單編號
// 1) 通過集合的stream方法創建流
Stream<Waybill> stream = waybills.stream();
// 2) 通過 filter 方法篩選運單大于5000的運單
Stream<Waybill> filterWaybill = stream.filter(item -> item.getPrice().compareTo(new BigDecimal(5000)) == 1);
// 3) 獲取篩選后的運單的編號
Stream<String> wayNoStream = filterWaybill.map(Waybill::getWayNo);
// 4) 將流轉換為新的集合
List<String> wayNoList = wayNoStream.collect(Collectors.toList());
// 5) 遍歷
wayNoList.forEach(System.out::println);
}
}

運行流程:

Stream操作分類

上節我們說,Stream的操作分為兩大類,【中間操作】和【結束操作】,這里詳細介紹一下

無狀態:元素的處理不受之前元素影響,比如:過濾,映射,轉換類型

有狀態:該元素只有拿到所有元素之后才能繼續下去,比如排序,去重

非短路操作:必須處理完所有元素才能得到結果,比如:求最值,遍歷

短路操作:遇到某些符合條件的元素就可以得到最終結果,比如:獲取第一個出現的數據

Stream創建

流可以用來處理數組、集合、IO資源等數據,而且分為【串行流】和【并行流】兩種,它的創建方式主要分為以下幾種:

使用Collection下的stream() 方法【串行流】和parallelStream() 方法【并行流】

List<String> list = Arrays.asList("a", "b", "c");
// 創建一個順序流
Stream<String> stream = list.stream();
// 創建一個并行流
Stream<String> parallelStream = list.parallelStream();

使用Arrays中的stream() 方法,將數組轉換為流

int[] array={1,3,5,6,8};
IntStream stream = Arrays.stream(array);

使用Stream中的靜態方法:of()、iterate()、generate()

對于iterate和generate這種沒有數據長度的流稱為【無限流】,需要使用limit()來指定流長度

比如generate是生成數據,生成多少數據?需要使用limit指定

Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
// 參數1:為起始值
// 參數2:每次的值進行什么操作,再基于結果做下一次的運算
// limit:最多4次操作
List<Integer> iterate = Stream.iterate(1, x -> x * 3).limit(4).collect(Collectors.toList());
System.out.println(iterate);
// 生成 3 個隨機數
Stream<Double> limit = Stream.generate(Math::random).limit(3);
limit.forEach(System.out::println);

使用 BufferedReader.lines() 方法,將每行內容轉成流

BufferedReader reader = new BufferedReader(new FileReader("D:\\stream.txt"));
Stream<String> lineStream = reader.lines();
lineStream.forEach(System.out::println);

使用 Pattern.splitAsStream() 方法,將字符串分隔成流

Pattern pattern = Pattern.compile(",");
Stream<String> stringStream = pattern.splitAsStream("a,b,c,d");
stringStream.forEach(System.out::println);

串行流和并行流區別

stream()方法創建的是【串行流】也可以叫【順序流】,由主線程按順序對流執行操作,而 parallelStream()方法創建的是【并行流】,內部以多線程并行執行的方式對流進行操作,但前提是流中的數據處理沒有順序要求。例如篩選集合中的奇數,兩者的處理不同之處:

如果流中的數據量足夠大,并行流可以加快處速度。

除了直接創建并行流,還可以通過 parallel()把順序流轉換成并行流:

 // 創建數組
Integer[] arr = {1,2,3,4,5,6,7,8,9,10};

// 通過 stream 轉換為串行流,再通過 Stream 對象的 parallel 方法轉換為并行流
Stream<Integer> integerStream = Arrays.stream(arr).parallel();
// 計算,并行流只能對無順序要求的計算生效
// mao:對每一個數據 * 2
List<Integer> list = integerStream.map(x -> x * 2).collect(Collectors.toList());
list.forEach(System.out::println);


責任編輯:武曉燕 來源: 今日頭條
相關推薦

2009-06-16 15:03:53

Hibernate保存Hibernate

2009-07-08 10:30:57

WebWork

2015-11-10 09:34:58

JavaScript方式

2017-06-09 11:00:42

前端DOMElement

2013-05-27 11:14:34

IT地址IP地址組成局域網IP

2010-08-10 09:51:38

路由器存儲分類接入方式

2010-05-12 16:13:04

2009-07-09 10:02:39

Actor模型Erlang

2010-02-03 10:17:29

C++繼承方式

2010-02-24 12:41:58

WCF異常處理

2010-03-03 10:50:22

Python字典應用方

2010-04-26 16:23:52

Oracle dele

2013-11-06 14:16:23

流程

2010-02-22 16:00:22

WCF序列化

2022-03-04 08:00:00

Java Strea數據函數

2020-03-28 16:08:32

條形圖Python分析

2010-01-21 17:15:22

可網管交換機

2020-12-28 08:29:47

Vuecss框架

2020-01-19 20:07:32

物聯網大數據IOT

2010-08-04 13:23:29

Flex事件
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美xxxx在线 | 日日操视频 | 九九综合九九 | 日韩中文一区二区 | 午夜精品福利视频 | 黄视频免费观看 | 久久国产精品首页 | 国产精品jizz在线观看老狼 | 久久99视频| 亚洲一区二区三区桃乃木香奈 | 欧美性猛交一区二区三区精品 | 毛片在线免费 | 久久综合一区二区 | 国产人成精品一区二区三 | 久久av一区二区三区 | 欧美激情亚洲天堂 | 国产目拍亚洲精品99久久精品 | 久久久久一区二区三区 | 亚洲福利在线视频 | 成人激情视频免费观看 | 欧美一区二区三区四区视频 | 中文字幕黄色大片 | 欧美另类视频在线 | 夜夜骑综合 | 国产精品美女久久久av超清 | 九九热在线免费观看 | 在线āv视频 | 日韩欧美国产精品 | 日韩一区二区三区四区五区 | 亚洲欧美日韩一区 | 一区二区高清 | 亚洲国产激情 | 美女久久 | 国产一区二区中文字幕 | 午夜免费视频 | 亚洲精品日韩视频 | 中文字幕不卡在线观看 | 国产一区二区三区四区 | 日韩中文字幕一区二区 | 国产黄视频在线播放 | 久久久久中文字幕 |