Java实战| java8特性 Stream应用实例
Stream是 Java 8新增加的类,用来补充集合类。用大白话来说,有了stream,java对集合的操作就更加方便了。本文将从其实际应用讲解分析,而关于其原理等信息请自行百度。
/**
* description
* created 2022/7/28 16:05
* 全文示例所使用的对象
* @author Jason Fire
* @version --添加版本信息
* @see --添加类中引用的相关类和接口
* @since Version 1.0
*/
@Data // 该注解为lombok依赖,没有的自行添加getter、setter
public class CarBean {
private String brand;
private String name;
private String price;
private int num;
}
1 简化foreach
Stream API可"替换"for、for-each、while循环,使用该方法,开发者可以专注于操作的逻辑,而无需关心元素序列的迭代。
List<CarBean> carBeanList = new ArrayList<>();
// 省略数据添加
// 原先forech写法
for (CarBean item:carBeanList
) {
// 业务处理
System.out.println(item.toString());
}
// 使用java特性
carBeanList.stream().forEach(item ->{
// 业务处理
System.out.println(item.toString());
});
2 统计分析
按对象的某个属性(字段)来进行分组、求和、求均值的统计分析操作
// 需要多种统计量
IntSummaryStatistics allTotal = carBeanList.stream().collect(Collectors.summarizingInt(CarBean ::getNum));
allTotal.getAverage();
allTotal.getCount();
allTotal.getMax();
allTotal.getMin();
allTotal.getSum();
// 只需要一种统计量
long total = carBeanList.stream().mapToLong(CarBean::getNum).sum();
// 按某个字段分组统计
// 比如按品牌分组统计销量
Map<String, Long> count = carBeanList.stream().collect(
Collectors.groupingBy(CarBean::getBrand,
Collectors.summingLong(CarBean::getNum))
);
3 去重
3.1 基本数据类型及String
List<String> stringList = new ArrayList<>();
// 省略数据添加
List<String> unique = stringList.stream().distinct().collect(Collectors.toList());
3.2 对象去重
- 方法一:
重写对象的equal和hasCode方法,然后就可以直接使用distinct (即按照基本数据类型处理)
//重写equals方法表示 brand 和 name 相同的对象就判定为相同对象
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
CarBean carBean = (CarBean) o;
return Objects.equals(brand, carBean.brand) &&
Objects.equals(name, carBean.name);
}
//重写hashCode详见Objects.hash()方法
@Override
public int hashCode() {
return Objects.hash(brand, name);
}
重写完CarBean 即可以使用上述distinct方法
List<CarBean> unique2 = carBeanList.stream().distinct().collect(Collectors.toList());
- 方法二
当无法重写对象的equal和hasCode方法,或者重写不是很方便的时候。可以结合treeSet进行处理
// 按name字段去重
List<CarBean> unique3 = carBeanList.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(CarBean::getName))), ArrayList::new)
);
4 对象是否存在
- 方法一:
// 按brand
String brand = "大奔";
boolean isContain = carBeanList.stream().anyMatch(item -> item.getBrand().equals(brand));
- 方法二:
// 按num
boolean b = carBeanList.stream().filter(t -> 3 == t.getNum()).findAny().isPresent();
5 排序
默认升序
// 单字段排序
List<CarBean> listSort2 = carBeanList.stream().sorted(
Comparator.comparing(CarBean::getBrand))
.collect(Collectors.toList());
// 多条件排序
// 按brand升序(如果brand有null值排最后),name降序,(如果name有null值排最后)
List<CarBean> listSort = carBeanList.stream().sorted(
Comparator.comparing(CarBean::getBrand,Comparator.nullsLast(String::compareTo))
.thenComparing(CarBean::getName,Comparator.nullsLast(String::compareTo).reversed()))
.collect(Collectors.toList());