日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Stream的分類,執(zhí)行流程和各種創(chuàng)建方式

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

成都創(chuàng)新互聯(lián)基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺為眾多戶提供簡陽服務(wù)器托管 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。

  • Stream的運(yùn)行流程,結(jié)合本篇和上一篇案例體會
  • Stream的創(chuàng)建方式
  • Stream的操作分類
  • 串行流和并行流區(qū)別

Stream運(yùn)行流程

這里通過一個(gè)運(yùn)費(fèi)案例,通過 【代碼實(shí)現(xiàn)】 +【 圖解】解釋清楚Stream計(jì)算數(shù)據(jù)時(shí)的流程!

需求:獲取運(yùn)單價(jià)格大于 5000元 的運(yùn)單編號

分析:

  • 創(chuàng)建運(yùn)單數(shù)據(jù)
  • 通過集合的stream方法創(chuàng)建流
  • 再通過調(diào)用流對象的 filter方法過濾出需要的數(shù)據(jù)【中間操作】
  • 再通過流對象的map方法獲取想要的字段數(shù)據(jù)【中間操作】
  • 在通過collect方法將流對象轉(zhuǎn)換為集合,終止流【終止操作】

代碼實(shí)現(xiàn):

運(yùn)單類可直接復(fù)用 《??Stream案例體驗(yàn)??》一篇

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

public class WaybillMain {

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

static {
// 創(chuàng)建數(shù)據(jù)
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、獲取運(yùn)費(fèi)大于5000的運(yùn)單編號
// 1) 通過集合的stream方法創(chuàng)建流
Stream stream = waybills.stream();
// 2) 通過 filter 方法篩選運(yùn)單大于5000的運(yùn)單
Stream filterWaybill = stream.filter(item -> item.getPrice().compareTo(new BigDecimal(5000)) == 1);
// 3) 獲取篩選后的運(yùn)單的編號
Stream wayNoStream = filterWaybill.map(Waybill::getWayNo);
// 4) 將流轉(zhuǎn)換為新的集合
List wayNoList = wayNoStream.collect(Collectors.toList());
// 5) 遍歷
wayNoList.forEach(System.out::println);
}
}

運(yùn)行流程:

Stream操作分類

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

無狀態(tài):元素的處理不受之前元素影響,比如:過濾,映射,轉(zhuǎn)換類型

有狀態(tài):該元素只有拿到所有元素之后才能繼續(xù)下去,比如排序,去重

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

短路操作:遇到某些符合條件的元素就可以得到最終結(jié)果,比如:獲取第一個(gè)出現(xiàn)的數(shù)據(jù)

Stream創(chuàng)建

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

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

List list = Arrays.asList("a", "b", "c");
// 創(chuàng)建一個(gè)順序流
Stream stream = list.stream();
// 創(chuàng)建一個(gè)并行流
Stream parallelStream = list.parallelStream();

使用Arrays中的stream() 方法,將數(shù)組轉(zhuǎn)換為流

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

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

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

比如generate是生成數(shù)據(jù),生成多少數(shù)據(jù)?需要使用limit指定

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

使用 BufferedReader.lines() 方法,將每行內(nèi)容轉(zhuǎn)成流

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

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

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

串行流和并行流區(qū)別

stream()方法創(chuàng)建的是【串行流】也可以叫【順序流】,由主線程按順序?qū)α鲌?zhí)行操作,而 parallelStream()方法創(chuàng)建的是【并行流】,內(nèi)部以多線程并行執(zhí)行的方式對流進(jìn)行操作,但前提是流中的數(shù)據(jù)處理沒有順序要求。例如篩選集合中的奇數(shù),兩者的處理不同之處:

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

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

 // 創(chuàng)建數(shù)組
Integer[] arr = {1,2,3,4,5,6,7,8,9,10};

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

本文題目:Stream的分類,執(zhí)行流程和各種創(chuàng)建方式
當(dāng)前地址:http://www.5511xx.com/article/dhposid.html