首先,給大家推薦一個好的地方:http://ifeve.com/stream/ 可以好好學一下
接下來,今天要刪除陣列中的某些元素,想到了之前用過的這個JDK8的Stream
1.Array轉化為Stream並進行篩選
【有個坑】:陣列轉化為Stream有兩種方式
1.Stream.of(陣列)
2.Arrays.stream(陣列)
區別:兩種都支援引用資料型別,但是如果是基本資料型別的話,請選擇第二種,所以妥善期間使用第二種比較合適。
【注意】:
使用stream進行任何操作,並不會因此而改變原資料的任何地方。因此想要獲取到處理後的資料,需要你接收下來。
【程式碼展示】:
①filter中一行程式碼如下:
@org.junit.Test public void test() throws IOException{ String [] str = "2.1.1&2.1.2&2.1.5&2.1.6&3.1.1&3.2.2&3.3.3&4.1.1&4.1.2&4.1.4&5.1.2&7.1.2&7.2.1&7.3.1.1&7.3.3.1&7.3.4.3&7.3.5.2&7.3.6.2&7.3.6.3".split("&"); Stream<String> stream = Arrays.stream(str); Object[] o1 = stream.filter(s -> s.contains("2.1.")).toArray(); for (int i = 0; i < o1.length; i++) { System.out.println(str[i].toString()); } }
②filter中寫程式碼塊的程式碼如下:
【注意】:filter中寫程式碼塊,需要true或者false都要返回,否則要報錯!
@org.junit.Test public void test() throws IOException{ String [] str = "2.1.1&2.1.2&2.1.5&2.1.6&3.1.1&3.2.2&3.3.3&4.1.1&4.1.2&4.1.4&5.1.2&7.1.2&7.2.1&7.3.1.1&7.3.3.1&7.3.4.3&7.3.5.2&7.3.6.2&7.3.6.3".split("&"); Stream<String> stream = Arrays.stream(str); Object[] o1 = stream.filter(s -> {if(s.contains("3.1.")&& ! s.contains("7.")){ return true; }return false; }).toArray(); //輸出原資料 System.out.println("輸出原資料"); for (int i = 0; i < str.length; i++) { System.out.println(str[i]); } System.out.println("輸出處理後資料"); for (int i = 0; i < o1.length; i++) { System.out.println(o1[i]); } }
2.List集合轉化為Stream
【集合.stream()即可】
3.使用count()計數
計算List中物件的某個屬性值為一個特定值的 物件有多少個
Long shanghaiNum = comList.stream().filter(i->"上海所屬產品".equals(i.getBelong())).count();
先把list轉化為stream(),然後filter中寫出需要滿足的篩選條件,最後count()計數。
4.List進行filter篩選後獲取到新的List
List<ComPriceSet> xianList = comList.stream().filter(i-> "西安所屬產品".equals(i.getBelong())).collect(Collectors.toList());
5.List按照物件的某個欄位進行去重 distinct()
【需要進行去重操作的物件,重新equals()方法】
例如下面:
package net.shopxx.controller.admin; /** * 產品工具類 內部結算銷量統計表 * @author SXD * */ public class ProCom { private Long productId; private String productName; public Long getProductId() { return productId; } public void setProductId(Long productId) { this.productId = productId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((productId == null) ? 0 : productId.hashCode()); result = prime * result + ((productName == null) ? 0 : productName.hashCode()); return result; } //規定如果productId一致,則代表兩個equals() 為true @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; ProCom other = (ProCom) obj; if (productId == null) { if (other.productId != null) return false; } else if (!productId.equals(other.productId)) return false; return true; } }
List<ProCom> xianProList = xianProList.stream().distinct().collect(Collectors.toList())
6.List中有需要按照某個欄位進行分組,可以使用Collectors.groupingBy()分組器實現
例如:
按照ComLabSet實體中productId進行分組,Collectors.groupingBy(ComLabSet::getProductId)中::後面跟的是你要分組的欄位的get方法名
package net.shopxx.controller.admin; /** * 匯出實驗室對賬單 工具類 * @author SXD * */ public class ComLabSet implements Comparable<ComLabSet>{ private Long orderId; //訂單ID private Boolean by_credit_card;//是否贈送 1true 0false private Long productId; //產品ID private String productName; //產品名稱 private String product_belong;//產品所屬公司 private String cybbm; //取樣包編碼 private Long sysId; //實驗室ID private String sysName; //實驗室名稱 public Long getOrderId() { return orderId; } public void setOrderId(Long orderId) { this.orderId = orderId; } public Boolean getBy_credit_card() { return by_credit_card; } public void setBy_credit_card(Boolean by_credit_card) { this.by_credit_card = by_credit_card; } public Long getProductId() { return productId; } public void setProductId(Long productId) { this.productId = productId; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public String getProduct_belong() { return product_belong; } public void setProduct_belong(String product_belong) { this.product_belong = product_belong; } public String getCybbm() { return cybbm; } public void setCybbm(String cybbm) { this.cybbm = cybbm; } public Long getSysId() { return sysId; } public void setSysId(Long sysId) { this.sysId = sysId; } public String getSysName() { return sysName; } public void setSysName(String sysName) { this.sysName = sysName; } @Override public int compareTo(ComLabSet s) { Long productId1 = this.getProductId(); Long productId2 = s.getProductId(); return productId1>productId2 ? 1 : productId1 == productId2 ? 0 : -1; } }
Map<Long,List<ComLabSet>> xianTypeMap = xianList.stream().collect(Collectors.groupingBy(ComLabSet::getProductId));
結果類似於下面:Map的鍵是分組欄位productId ,值是一組的list
7.mapToInt 的使用之 字串陣列轉化成整型陣列
String[] stringArr = new String[]{"111","222","333"}; int [] intArr = Arrays.stream(stringArr).mapToInt(s->Integer.parseInt(s)).toArray(); for (int i = 0; i < intArr.length; i++) { System.out.println(intArr[i]); }
效果:
8.List轉化為陣列
專刊:http://www.cnblogs.com/sxdcgaq8080/p/8269877.html
9.將物件陣列轉化為String陣列
這裡演示,就將反射物件轉化為String[],主要是看怎麼轉化為String[],任意物件陣列都可以【注意最後toArray(String[]::new)才是轉化為String陣列的關鍵】
User user = new User(); user.setPassword("adsas"); user.setUserName("德瑪西亞"); String [] strs = Arrays.stream(user.getClass().getDeclaredFields()).map((field) ->{ return field.getName().toString(); }).toArray(String[]::new); System.out.println(strs[0] instanceof String);
10.List去重
List<String> unique = list.stream().distinct().collect(Collectors.toList());
11.List<GoodsMsg>按照集合中實體GoodsMsg 中的floor欄位進行升序排序和降序排序【本方法 不需要GoodsMsg實體實現Comparable介面】
升序:
list = list.stream().sorted(Comparator.comparing(GoodsMsg::getFloor)).collect(Collectors.toList());
降序:
list = list.stream().sorted(Comparator.comparing(GoodsMsg::getFloor).reversed()).collect(Collectors.toList());
12.List<實體>獲取List<String>其中一個欄位
List<String> toIds = mappers.stream().map(i->i.getToUid()).collect(Collectors.toList());
13.List<Dealer> dealer實體按照id欄位去重 List集合實體按照某個欄位去重 不用更改實體的做法【效率一定比自己做去重要快很多】【可以嘗試ArrayList和LinkedList兩種】
list = list.parallelStream().filter(distinctByKey(Dealer::getId)).collect(Collectors.toList());
public static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) { Set<Object> seen = ConcurrentHashMap.newKeySet(); return t -> seen.add(keyExtractor.apply(t)); }