首先,给大家推荐一个好的地方: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