摘要:數(shù)值流的使用想要使用數(shù)值流其實(shí)很簡(jiǎn)單,只需要調(diào)用方法就可以獲得一個(gè)數(shù)值流了,我們會(huì)發(fā)現(xiàn)數(shù)值流有更多的封裝好的計(jì)算方法,更加方便我們對(duì)數(shù)值的計(jì)算。運(yùn)行結(jié)果有時(shí)候我們可能會(huì)想將數(shù)值流轉(zhuǎn)換回原來(lái)的流,我們可以調(diào)用方法。
數(shù)值流:
數(shù)值流,顧名思義就是專門用來(lái)操作基礎(chǔ)數(shù)據(jù)類型的流,那它的作用是什么呢?先看下面的代碼。這段代碼是獲取集合每個(gè)對(duì)象的num字段的值,然后求所和。得出的結(jié)果是15,看上去沒(méi)有問(wèn)題,但是要注意的是流在進(jìn)行求和操作的時(shí)候從對(duì)象中取出來(lái)的是基本類型,會(huì)進(jìn)行裝箱操作變成Integer類型再進(jìn)行求和,性能會(huì)有所下降,而數(shù)值流就是專門對(duì)基本類型數(shù)據(jù)進(jìn)行操作的。
public class DataStream { public static void main(String[] args){ List數(shù)值流的使用:list = new ArrayList (); Num num1 = new Num(1); Num num2 = new Num(2); Num num3 = new Num(3); Num num4 = new Num(4); Num num5 = new Num(5); list.add(num1); list.add(num2); list.add(num3); list.add(num4); list.add(num5); System.out.println(list.stream().map(Num::getNum).reduce(Integer::sum)); } } class Num{ private int num; public Num(int num) { this.num = num; } public int getNum() { return num; } public void setNum(int num) { this.num = num; } }
1.想要使用數(shù)值流其實(shí)很簡(jiǎn)單,只需要調(diào)用Stream.mapToInt()方法就可以獲得一個(gè)數(shù)值流了,我們會(huì)發(fā)現(xiàn)數(shù)值流有更多的封裝好的計(jì)算方法,更加方便我們對(duì)數(shù)值的計(jì)算。
System.out.println(list.stream().mapToInt(Num::getNum).count()); System.out.println(list.stream().mapToInt(Num::getNum).sum()); System.out.println(list.stream().mapToInt(Num::getNum).max()); System.out.println(list.stream().mapToInt(Num::getNum).min()); System.out.println(list.stream().mapToInt(Num::getNum).average());
運(yùn)行結(jié)果:
5 15 OptionalInt[5] OptionalInt[1] OptionalDouble[3.0]
2.需要注意的是max、min和average方法如果在流為空的時(shí)候獲取不到值會(huì)返回空的Optional對(duì)象,而count和sum方法則是返回0。
運(yùn)行結(jié)果:
0 0 OptionalInt.empty OptionalInt.empty OptionalDouble.empty
3.有時(shí)候我們可能會(huì)想將數(shù)值流轉(zhuǎn)換回原來(lái)的流,我們可以調(diào)用boxed()方法。
public static void changeStream(){ int[] arr = new int[]{1,2,3,4,5}; IntStream intStream = Arrays.stream(arr); Streamstream = intStream.boxed(); }
4.上面我們介紹的是IntStream,它專門用來(lái)處理int類型的數(shù)值,除此之外還有DoubleStream和LongStream,它們分別處理double和long類型的數(shù)值,只要調(diào)用mapToDouble和mapToLong方法即可獲得對(duì)應(yīng)的數(shù)值流,使用方法也是IntStream大同小異,這里就不做詳細(xì)介紹了。
構(gòu)建流:之前的文章中我們一直都是直接調(diào)用集合的stream方法來(lái)獲取一個(gè)流,其實(shí)獲取流的方式有很多種。
直接使用值初始化流
public static void valueStream(){ Streamstream = Stream.of("Hello", "World "); stream.map(String::toUpperCase).forEach(System.out::println); }
使用Arrays.stream()靜態(tài)方法創(chuàng)建流,這個(gè)方法接受一個(gè)數(shù)組
public static void arrayStream(){ String[] strs = new String[]{"Hello","World"}; Arrays.stream(strs).map(String::toUpperCase).forEach(System.out::println); }
從文件中讀取獲取流,每一行就是流中的一個(gè)元素
public static void fileStream(){ try { Streamtext = Files.lines(Paths.get("C:UsersHalfDesktop est.txt"),Charset.defaultCharset()); text.forEach(System.out::println); } catch (IOException e) { e.printStackTrace(); } }
用函數(shù)生成無(wú)限流,分別調(diào)用Stream.iterate()和Stream.generate()方法即可,兩者不同之處在于Stream.iterate()方法沒(méi)生成一個(gè)值都要依賴于前一個(gè)值,適合生成連續(xù)的數(shù)值,而Stream.generate()則每個(gè)值都是獨(dú)立生成的,相互之間沒(méi)有關(guān)聯(lián)。要注意的是因?yàn)槭菬o(wú)限流,所以會(huì)一直生成元素,所以必須要調(diào)用limit()方法來(lái)限制生成的個(gè)數(shù),否則代碼會(huì)一直運(yùn)行下。
Stream.iterate()接受兩個(gè)參數(shù),分別是起始值和后續(xù)值的生成代碼,例如下面這個(gè)方法就是從0開始,依次加10
public static void iterateStream(){ Stream.iterate(0, num -> num+10).limit(5).forEach(System.out::println); }
運(yùn)行結(jié)果:
0 10 20 30 40
Stream.generate()接受一個(gè)參數(shù),生成數(shù)值的代碼
public static void generateStream(){ Stream.generate(Math::random).limit(5).forEach(System.out::println); }
運(yùn)行結(jié)果:
0.9538068193407456 0.5113995186169759 0.20525086606957266 0.2974528805300197 0.019653649898021208總結(jié):
這篇文章介紹了數(shù)值流和構(gòu)建流的方式,流的應(yīng)用可以很靈活,后續(xù)還會(huì)介紹流的用法。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/77120.html
摘要:新特性總覽標(biāo)簽本文主要介紹的新特性,包括表達(dá)式方法引用流默認(rèn)方法組合式異步編程新的時(shí)間,等等各個(gè)方面。還有對(duì)應(yīng)的和類型的函數(shù)連接字符串廣義的歸約匯總起始值,映射方法,二元結(jié)合二元結(jié)合。使用并行流時(shí)要注意避免共享可變狀態(tài)。 Java8新特性總覽 標(biāo)簽: java [TOC] 本文主要介紹 Java 8 的新特性,包括 Lambda 表達(dá)式、方法引用、流(Stream API)、默認(rèn)方...
摘要:歸約把一個(gè)流中的元素組合起來(lái),使用操作來(lái)表達(dá)更復(fù)雜的查詢,比如計(jì)算菜單中的總卡路里或菜單中卡路里最高的菜是哪一個(gè)。有沒(méi)有交易員是在深圳工作的打印生活在北京的交易員的所有交易額。 篩選和切片 filter 方法 distinct 方法 limit 方法 skip 方法 謂詞篩選 Stream 接口支持 filter 方法,該操作會(huì)接受一個(gè)謂詞(一個(gè)返回 boolean的函數(shù))作為參數(shù)...
摘要:內(nèi)部迭代與使用迭代器顯式迭代的集合不同,流的迭代操作是在背后進(jìn)行的。流只能遍歷一次請(qǐng)注意,和迭代器類似,流只能遍歷一次。 流(Stream) 流是什么 流是Java API的新成員,它允許你以聲明性方式處理數(shù)據(jù)集合(通過(guò)查詢語(yǔ)句來(lái)表達(dá),而不是臨時(shí)編寫一個(gè)實(shí)現(xiàn))。就現(xiàn)在來(lái)說(shuō),你可以把它們看成遍歷數(shù)據(jù)集的高級(jí)迭代器。此外,流還可以透明地并行處理,你無(wú)需寫任何多線程代碼了!我會(huì)在后面的筆記中...
摘要:補(bǔ)充一點(diǎn)使用數(shù)值流可以避免計(jì)算過(guò)程中拆箱裝箱,提高性能。其目的主要是打開流,做出某種程度的數(shù)據(jù)映射過(guò)濾,然后返回一個(gè)新的流,交給下一個(gè)操作使用。終端操作的執(zhí)行,才會(huì)真正開始流的遍歷。 Java8的新特性主要是Lambda表達(dá)式和流,當(dāng)流和Lambda表達(dá)式結(jié)合起來(lái)一起使用時(shí),因?yàn)榱魃昝魇教幚頂?shù)據(jù)集合的特點(diǎn),可以讓代碼變得簡(jiǎn)...
摘要:第三個(gè)問(wèn)題查找所有來(lái)自于劍橋的交易員,并按姓名排序。第六個(gè)問(wèn)題打印生活在劍橋的交易員的所有交易額。第八個(gè)問(wèn)題找到交易額最小的交易。 付諸實(shí)戰(zhàn) 在本節(jié)中,我們會(huì)將迄今學(xué)到的關(guān)于流的知識(shí)付諸實(shí)踐。我們來(lái)看一個(gè)不同的領(lǐng)域:執(zhí)行交易的交易員。你的經(jīng)理讓你為八個(gè)查詢找到答案。 找出2011年發(fā)生的所有交易,并按交易額排序(從低到高)。 交易員都在哪些不同的城市工作過(guò)? 查找所有來(lái)自于劍橋的交易...
閱讀 1543·2019-08-30 15:44
閱讀 2003·2019-08-30 14:07
閱讀 2955·2019-08-30 13:56
閱讀 2428·2019-08-29 17:06
閱讀 1404·2019-08-29 14:13
閱讀 2139·2019-08-29 11:28
閱讀 3303·2019-08-26 13:56
閱讀 2016·2019-08-26 12:11