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