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());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PythonJavaC++go

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值