摘要:前言在前面的之介紹和使用和之進階中講了的使用方式和一些常用的方法,這篇文章就來演示一下的實際應用。實際應用先創建一個訂單類和商品類,每個訂單都有年份商品數量和商品對象屬性,而商品類里面則包含了名字和價格屬性。
前言:
在前面的 Java 8之stream介紹和使用 和 Java 8之stream進階 中講了stream的使用方式和一些常用的方法,這篇文章就來演示一下stream的實際應用。
實際應用:
先創建一個訂單類和商品類,每個訂單都有年份、商品數量和商品對象屬性,而商品類里面則包含了名字和價格屬性。像這種結構的數據在日常開發中會經常看到,現在就使用stream來嘗試滿足各種不同的類型的數據獲取。
public class Goods { //商品名字 private final String name; //商品價格 private final String price; public Goods(String name, String price) { this.name = name; this.price = price; } public String getName() { return name; } public String getPrice() { return price; } @Override public String toString() { return "Goods{" + "name="" + name + """ + ", price="" + price + """ + "}"; } } public class Order { //商品對象 private final Goods goods; //訂單日期 private final int year; //商品數量 private final int total; public Order(Goods goods, int year, int total) { this.goods = goods; this.year = year; this.total = total; } public Goods getGoods() { return goods; } public int getYear() { return year; } public int getTotal() { return total; } @Override public String toString() { return "Order{" + "goods=" + goods + ", year=" + year + ", total=" + total + "}"; } }
模擬點數據
public class testClass { static Goods bread = new Goods("面包", 10.0); static Goods milk = new Goods("牛奶", 12.0); static Goods juice = new Goods("果汁", 6.0); static Goods ham = new Goods("火腿", 20.0); static Listorders = Arrays.asList( new Order(ham, 2011, 300), new Order(bread, 2012, 1000), new Order(bread, 2011, 400), new Order(milk, 2012, 710), new Order(milk, 2012, 700), new Order(juice, 2012, 950) );
下面來試使用stream獲取不同條件下的數據
//找出2011年所有的訂單,按商品數量從低到高排序 public static void findOne(){ orders.stream() //先篩選年份 .filter(trader -> trader.getYear()==2011) //再排序商品數量 .sorted(Comparator.comparing(Order::getTotal)) .collect(Collectors.toList()) .forEach(System.out::println); } //獲取所有訂單的里所有商品的單價 public static void findTwo() { orders.stream() //先查出所有訂單的里的商品價格 .map(order -> order.getGoods().getPrice()) //去重后轉化為List類型 //.distinct() //.collect(Collectors.toList()) //或者直接轉化為Set類型,自動去重 .collect(Collectors.toSet()) .forEach(System.out::println); } //查找訂單中所有單價為12的商品 public static void findThree() { orders.stream() //獲取商品的流 .map(order -> order.getGoods()) //價格等于12的 .filter(goods -> goods.getPrice().equals(12.0)) //去重 .distinct() .collect(Collectors.toList()) .forEach(System.out::println); } //查所有商品的名字,拼接成一個符串 public static void findFour() { String string = orders.stream() //獲取所有商品的名字 .map(order -> order.getGoods().getName()) //去重 .distinct() //使用reduce方法自行拼接 //.reduce("",(str1,str2) -> str1 + str2); //或者使用joining方法自動拼接 .collect(Collectors.joining()); System.out.println(string); } //判斷所有訂單中是否有價格為20的商品 public static void findFive() { boolean flag = orders.stream() //查詢是否有符合條件的元素 .anyMatch(order -> order.getGoods().getPrice().equals(20.0)); System.out.println(flag); } //所有訂單中商品價格12的商品累計數量 public static void findSix() { int num = orders.stream() //篩選出價格12的商品 .filter(order -> order.getGoods().getPrice().equals(12.0)) //獲取價格為12的商品的金額組成的流 .map(Order::getTotal) //累加所有的金額 .reduce(0, Integer::sum); System.out.println(num); } //找出所有訂單中最大的數量 public static void findSeven() { int max = orders.stream() //獲取所有訂單的數量 .map(Order::getTotal) //找到最大的 .reduce(0, Integer::max); System.out.println(max); } //找出所有訂單中商品數量最小的 public static void findEight() { orders.stream() //獲取所有訂單的數量 .map(Order::getTotal) //找到最大的 .reduce(Integer::min) //如果返回的結果不是空就打印 .ifPresent(System.out::println); }總結:
以上就是stream的實際應用,上述情況在日常開發中還是很常見到的,如果不用stream的代碼寫起來不僅非常繁瑣還容易出錯,得新建很多個集合不停的遍歷、判斷和存取,但是用了stream之后就非常的簡單,代碼也很清晰,后面還會介紹到stream別的特性和用法。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/76772.html
摘要:從發布到現在,已有三年多了,也得到了廣泛的應用,但似乎里面最重要的特性和對很多人來說還是很陌生。想通過介紹一些實際的問題和答案來講解在現實開發中我們可以通過和可以做些什么,以及什么是正確的姿勢。 從Java 8 2014 發布到現在,已有三年多了,JDK 8 也得到了廣泛的應用,但似乎Java 8里面最重要的特性:Lambdas和Stream APIs對很多人來說還是很陌生。想通過介紹...
摘要:本文主要介紹了中的閉包與局部套用功能,由國內管理平臺編譯呈現。譬如,認為給帶來了閉包特性就是其中之一。但是首先,我們將考慮如何利用閉包進行實現。很顯然,閉包打破了這一準則。這就是局部調用,它總是比閉包更為穩妥。 【編者按】本文作者為專注于自然語言處理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主講 Java 軟件開發的書籍,自2008開始供職于 ...
摘要:獲取每個元素的字符串長度放入新流中,然后轉為類型。歸約歸約就是把整個流歸約成一個值的操作,比如求集合中最大的元素所有元素值的和之類的操作。 前言: 上一篇文章 Java 8之stream介紹和使用 中講解了stream的定義和用法,簡單介紹幾個最基本最常用的方法,其實stream還有更強大的功能,這篇文章就會給大家介紹stream的進階用法。 篩選: 在上一篇文章中我們介紹了使用fi...
摘要:使用我們來看下面這段代碼,里面有一個屬性代表菜品的卡路里值,現在的需求是按卡路里對菜品進行排序再返回菜名,并且要求卡路里的值大于。 前言: 在實際開發中經常需要獲取各種各樣不同格式的數據,因為數據庫的表結構是一開始就設計好的所以很多時候我們不得不先從數據庫里或其他地方獲得數據后再根據需求去一層一層的篩選數據,在Java 8之前的做法不外乎就是各種List、Set一起上,各種循環判斷。如...
摘要:可以使用方法替換常規循環以上代碼的產出所有這些原始流都像常規對象流一樣工作,但有以下不同之處原始流使用專門的表達式,例如代替或代替。原始流支持額外的終端聚合操作,以上代碼的產出有時將常規對象流轉換為基本流是有用的,反之亦然。 本文提供了有關Java 8 Stream的深入概述。當我第一次讀到的Stream API,我感到很困惑,因為它聽起來類似Java I/O的InputStream,...
閱讀 1629·2023-04-25 18:27
閱讀 1389·2021-10-19 11:44
閱讀 563·2021-10-14 09:42
閱讀 2138·2021-10-11 10:59
閱讀 2769·2021-09-24 09:47
閱讀 1723·2019-08-30 14:20
閱讀 1150·2019-08-30 14:08
閱讀 731·2019-08-29 15:15