【java】Stream的使用
首先,给大家推荐一个好的地方: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.按照实体的某个字段 转换类型后再分组
例如:将student的 String字段name 转换成 Long类型。将name按照Long类型进行分组
student实体
package com.sxd.streamTest; /**
* @ClassName Student
* @Description TODO
* @Author sxd
* @Date 2019/9/26 21:06
* @Version 1.0
*/
public class Student { private String name; private Integer age; public Long getNameToLong(){
return Long.valueOf(name);
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public Student(String name, Integer age) {
this.name = name;
this.age = age;
} @Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
转化:
//name按照String类型分组
Map<String, List<Student>> collect = list.stream().collect(Collectors.groupingBy(Student::getName));
//name按照Long类型分组
Map<Long, List<Student>> collect1 = list.stream().collect(Collectors.groupingBy(Student::getNameToLong));
8.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]);
}
效果:
9.List转化为数组
专刊:http://www.cnblogs.com/sxdcgaq8080/p/8269877.html
10.将对象数组转化为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);
11.List去重
List<String> unique = list.stream().distinct().collect(Collectors.toList());
12.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());
13.List<实体>获取List<String>其中一个字段
List<String> toIds = mappers.stream().map(i->i.getToUid()).collect(Collectors.toList());
14.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));
}
15.List<Student> Student实体 按照 id和name 两个字段或多个字段 去重
List<Student> distinctResult = studentList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(o -> o.getId() + ";" + o.getAge()))), ArrayList::new));
16.字符串逗号切割,字符串数组转化成Long类型的List或Set
String str = "123,456,789,220,,";
try {
List<Long> collect = Arrays.asList(str.split(",")).stream().map(a -> Long.parseLong(a)).collect(Collectors.toList());
Set<Long> set = new HashSet<>(collect);
System.out.println(set.size());
}catch (Exception e){
throw new Exception("搞一下?");
}
17.List转Map【根据ID做为key,对象做value】
List<WareExtVO> list;
list.stream().collect(Collectors.toMap(WareExtVO::getSkuId, wareExtVO -> wareExtVO));
18.List转Map【ID做key,另一个字段做value】
Map<Integer, String> collect = wmStores.stream().filter(i -> difference.contains(i.getId().toString())).collect(Collectors.toMap(WmStore::getId, WmStore::getSap_id));
19.对封装类List集合进行排序,升序或降序
List<Long> list = new ArrayList<>();
list.add(12L);
list.add(10L);
list.add(17L);
list.add(7L); //升序
List<Long> collect = list.stream().sorted().collect(Collectors.toList());
for (Long aLong : collect) {
System.out.println(aLong);
} //降序
List<Long> collect1 = list.stream().sorted(Comparator.comparing(Long::longValue).reversed()).collect(Collectors.toList());
for (Long aLong : collect1) {
System.out.println(aLong);
}
20.
【java】Stream的使用的更多相关文章
- Java Stream 使用详解
Stream是 Java 8新增加的类,用来补充集合类. Stream代表数据流,流中的数据元素的数量可能是有限的,也可能是无限的. Stream和其它集合类的区别在于:其它集合类主要关注与有限数量的 ...
- Java Stream API性能测试
已经对Stream API的用法鼓吹够多了,用起简洁直观,但性能到底怎么样呢?会不会有很高的性能损失?本节我们对Stream API的性能一探究竟. 为保证测试结果真实可信,我们将JVM运行在-ser ...
- java stream 原理
java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字,然后从中选 ...
- Java – Stream has already been operated upon or closed
Java – Stream has already been operated upon or closed package com.mkyong.java8; import java.util.Ar ...
- java stream collector
Java Stream API进阶篇 本文github地址 上一节介绍了部分Stream常见接口方法,理解起来并不困难,但Stream的用法不止于此,本节我们将仍然以Stream为例,介绍流的规约操作 ...
- Java Stream简介, 流的基本概念
在Javaor .net编程中, 我们经常见到"stream" 这个字眼. 我们大概知道这是个流的意思, 如果看完本文的话, 应该会有1个大概的概念. 一, Java中什么是St ...
- Java-Runoob:Java Stream、File、IO
ylbtech-Java-Runoob:Java Stream.File.IO 1.返回顶部 1. Java 流(Stream).文件(File)和IO Java.io 包几乎包含了所有操作输入.输出 ...
- Java Stream函数式编程案例图文详解
导读 作者计划把Java Stream写成一个系列的文章,本文只是其中一节.更多内容期待您关注我的号! 一.什么是Java Stream? Java Stream函数式编程接口最初是在Java 8中引 ...
- Java Stream函数式编程图文详解(二):管道数据处理
一.Java Stream管道数据处理操作 在本号之前发布的文章<Java Stream函数式编程?用过都说好,案例图文详解送给你>中,笔者对Java Stream的介绍以及简单的使用方法 ...
- Java Stream函数式编程第三篇:管道流结果处理
一.Java Stream管道数据处理操作 在本号之前写过的文章中,曾经给大家介绍过 Java Stream管道流是用于简化集合类元素处理的java API.在使用的过程中分为三个阶段.在开始本文之前 ...
随机推荐
- HDU 1937 J - Justice League
J - Justice League Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u ...
- [洛谷P3805]【模板】manacher算法
题目大意:给你一个字符串,求出它的最长回文字段 题解:$manacher$算法 卡点:$p$数组未开两倍空间 C++ Code: #include <cstdio> #include &l ...
- 【CF Round 439 E. The Untended Antiquity】
time limit per test 2 seconds memory limit per test 512 megabytes input standard input output standa ...
- Codeforces Round #352 (Div. 2) C
C. Recycling Bottles time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- freemarker的简单入门程序
本文主要介绍了freemarker的常用标签<#list> <#import> <#assign> <#if> <#else> &l ...
- webdriver操作iframe标记的编辑器
1.iFrame有ID 或者 name的情况//进入id="frame1"的frame中,定位id="div1"的div和id="input1&quo ...
- 计算器的改良(纯字符串)o1
原题传送门 这题比较水,就是细节..多了点. 首先字符串要处理好(废话..) 基础不行的话要多去看看书.. 然后捏,这题主要就是几个判断: 当我们读字符,如果读到运算符号,那么就要停下来,把之前的常数 ...
- switch与if 性能测试
测试结果:switch性能更高. 测试过程:新建一个Win32 Console Application, 在cpp文件中添加下面代码 #include "stdafx.h" #in ...
- java基础练习 20
import java.util.Scanner; public class Twentieth { /*某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都 ...
- Linux下使用system()函数一定要谨慎
转载自:http://my.oschina.net/renhc/blog/53580 linux尽量避免使用system. 曾经的曾经,被system()函数折磨过,之所以这样,是因为对syste ...