Java数据处理

1. 数据去重

①stream流去重(本质还是使用treeset)

public static List<UserBean> handleRepeatByStream(List<UserBean> userBeanList){
        if (userBeanList == null || userBeanList.size() == 0){
            return userBeanList;
        }
        return userBeanList.stream().collect(Collectors.collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(UserBean::getName))) ,ArrayList::new));
    }

②HashMap去重(利用hashMap的key值不能重复来对list去重)

public static List<UserBean> handleRepeatByHashMap(List<UserBean> userBeanList){
        
        if (userBeanList == null || userBeanList.size() == 0){
            return userBeanList;
        }
        Map<String, UserBean> map = new HashMap<>();
        ArrayList<UserBean> list = new ArrayList<>();

        userBeanList.forEach(userBean -> map.put(userBean.getName(), userBean));
        map.forEach((s,userBean) -> list.add(userBean));
        return list;
    }

③TreeSet去重(利用set集合不可重复来对list去重)

public static List<UserBean> handleRepeatByTreeset(List<UserBean> userBeanList){

        if (userBeanList == null || userBeanList.size() == 0){
            return userBeanList;
        }

        Set<UserBean> set = new TreeSet<>(new Comparator<UserBean>() {
            @Override
            public int compare(UserBean o1, UserBean o2) {
                return o1.getName().compareTo(o2.getName());
            }
        });
        set.addAll(userBeanList);
        return new ArrayList<>(set);
    }

2. 数据过滤

①使用stream流中的filter进行过滤

    public void filterByStream(List<UserBean> userList){
        userList = userList.stream().filter(userBean -> userBean.getAge() > 18).collect(Collectors.toList());
    }

②根据迭代器进行过滤

    public void filterByInterator(List<UserBean> userList){
        List<UserBean> newUserBeanList = new ArrayList<>();
        Iterator<UserBean> iterator = userList.iterator();
        while (iterator.hasNext()){
            UserBean userBean = iterator.next();
            if (userBean.getAge() > 18){
                newUserBeanList.add(userBean);
            }
        }
    }

3. 数据排序

①使用comparator比较器进行排序

 public void sortByComparator(List<UserBean> userList){
        Collections.sort(userList, new Comparator<UserBean>() {
            @Override
            public int compare(UserBean o1, UserBean o2) {
                return o1.getAge - o2.getAge;
            }
        });

②通过实现comparable接口进行排序(被比较的对象的类需要实现comparable接口并重写compareTo方法)

public void sortByComparable(List<UserBean> userList){
        Collections.sort(userList);
    }

③使用stream流中的sort进行排序

public void sortByStream(List<UserBean> userList){
        userList = userList.stream().sorted(Comparator.comparing(UserBean::getAge)).collect(Collectors.toList());
    }

4. 数据分组

①Map集合分组

public Map<String, List<Grade>> groupByMap(List<Grade> gradeList){
        Map<String, List<Grade>> map = new HashMap<>();
        for (Grade grade : gradeList) {
            if (!map.containsKey(grade.getClassName())){
                ArrayList<Grade> list = new ArrayList<>();
                list.add(grade);
                map.put(grade.getClassName(),list);
            }else{
                map.get(grade.getClassName()).add(grade);
            }
        }
        return map;
    }

②stream流分组

public Map<String,List<Grade>> groupByStream(List<Grade> gradeList) {
        HashMap<String, List<Grade>> map = new HashMap<>();
        return gradeList.stream().filter(Objects::nonNull)
                .collect(Collectors.groupingBy(Grade::getClassName));
    }

5. 处理空指针异常

① if判断处理npe

//使用if判断的缺点是:嵌套太深,代码阅读性差 
public String getCountryByIf(User user){
    if (user != null) {
        Company company = user.getCompany();
        if (company != null){
            Address address = company.getAddress();
            if (address != null){
                String country = address.getCountry();
                return country;
            }
        }
    }
    return null;
}

② jdk8中的Optional类处理npe

private String optionalGetCountry(User user) {
    return Optional.ofNullable(user)
            .map(User::getCompany)
            .map(Company::getAddress)
            .map(Address::getCountry)
            .orElse(getCountry());       
}

③使用spring框架的assert断言处理

private String assertGetCountry(User user) {
    Assert.notNull(user, "用户不能为空");
    Company company = user.getCompany();
    Assert.notNull(company, "公司不能为空");
    Address address = company.getAddress();
    Assert.notNull(address,"地址不能为空");
    String country = address.getCountry();
    return country;
}

6. Stream流使用Filter,Sort,GroupBy,Average,Sum操作List

Stream流处理数据的过程:

1. 源头:将源数据转换为Stream流对象

2. 管道:将Stream流对象进行处理,包括过滤、排序、分组,并且返回一个Stream流对象

2. 终点:最后对Stream流对象进行遍历、收集、统计等操作

①Stream流处理list集合---Filter

public List<Grade>  filterByStream(List<Grade> gradeList){
    return gradeList.stream()
            .filter(Objects::nonNull)
            .filter(grade -> grade.getEnglishScore() > 81)
            .collect(Collectors.toList());
}

②Stream流处理list集合---Sort

public List<Grade> sortByStream(List<Grade> gradeList) {
  return gradeList.stream()
          .filter(Objects::nonNull)
          .sorted(Comparator.comparing(Grade ::getChineseScore))
          .collect(Collectors.toList());
}

③Stream流处理list集合---GroupBy

public Map<String,List<Grade>> groupByStream(List<Grade> gradeList) {
        return gradeList.stream()
                .filter(Objects::nonNull)
                .collect(Collectors.groupingBy(Grade::getSlassName));
    }

④Stream流处理list集合---Average

public Double averageByStream(List<Grade> gradeList) {
    return gradeList.stream()
            .filter(Objects::nonNull)
            .mapToInt(Grade::getChineseScore)
            .average()
            .orElseThrow(IllegalAccessError::new);
}

⑤Stream流处理list集合---Sum

public Integer sumBySteam(List<Grade> gradeList){
    return gradeList.stream()
            .filter(Objects::nonNull)
            .mapToInt(Grade::getChineseScore)
            .sum();
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值