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