java8获取两个list的交集和差集_Java8的Stream API的一些奇技淫巧

场景引入

Java8的新特性主要是Lambda表达式和流,当流和Lambda表达式结合起来一起使用时,因为流申明式处理数据集合的特点,可以让代码变得简洁易读

航哥前两天有一个新需求,做完之后由衷地感叹到lambda表达式和stream流是真香。先大致看一下需求吧。

在电商网站中,一次性返回所有前端类目,树形结构返回json格式。

先看一下我们的数据库关于类目表的设计

很简单,总共三级类目,类目有自己的父级父类目id,一级类目的父id为空

因为需要比较快地开发出来,所以我就考虑试试新学习的lambda表达式和stream结合,废话不说,看主要代码。

@Override    public SelectCategoryByTreeRespData selectCategoryByTree(SelectCategoryByTreeReqData reqData) {
            //查询出数据库所有类目数据        List dataList = tbCategoryMapper.selectCategoryByTree(reqData);        List respData = dataList.stream().filter(vo -> "".equals(vo.getParentid()))                .peek(vo -> vo.setChildList(getChildCategoryList(vo, dataList)))                .collect(Collectors.toList());        return SelectCategoryByTreeRespData.builder().list(respData).build();    }    private List getChildCategoryList(CategoryByTreeRespData data, List dataList) {
            //递归调用设置子类目列表        return dataList.stream().filter(vo -> vo.getParentid().equals(data.getCategoryId()))                .peek(vo -> vo.setChildList(getChildCategoryList(vo, dataList)))                .collect(Collectors.toList());    }

没错,就简单的几行代码就实现了功能。几分钟不到就将一个接口写好提供给前端联调了。体验到啦lambda带来的便利,所以就产生了想要再深入研究一下的想法。下面就结合一个小例子大致看一些小技巧。

放大招,Stream流如何简化代码

如果有一个需求,需要对数据库查询到的菜肴进行一个处理:

  • 筛选出卡路里小于400的菜肴

  • 对筛选出的菜肴进行一个排序

  • 获取排序后菜肴的名字

菜肴:Dish.java

@Datapublic class Dish {
        private String name;    private boolean vegetarian;    private int calories;    private Type type;}

Java8以前的实现方式

private List beforeJava7(List dishList) {
            List lowCaloricDishes = new ArrayList<>();        //1.筛选出卡路里小于400的菜肴        for (Dish dish : dishList) {
                if (dish.getCalories() < 400) {
                    lowCaloricDishes.add(dish);            }        }        //2.对筛选出的菜肴进行排序        Collections.sort(lowCaloricDishes, new Comparator() {
                @Override            public int compare(Dish o1, Dish o2) {
                    return Integer.compare(o1.getCalories(), o2.getCalories());            }        });        //3.获取排序后菜肴的名字        List lowCaloricDishesName = new ArrayList<>();        for (Dish d : lowCaloricDishes) {
                lowCaloricDishesName.add(d.getName());        }        return lowCaloricDishesName;    }

Java8之后的实现方式

 private List afterJava8(List dishList) {
            return dishList.stream()                .filter(d -> d.getCalories() < 400)  //筛选出卡路里小于400的菜肴                .sorted(comparing(Dish::getCalories))  //根据卡路里进行排序                .map(Dish::getName)  //提取菜肴名称                .collect(Collectors.toList()); //转换为List    }

不拖泥带水,一气呵成,原来需要写24代码实现的功能现在只需5行就可以完成了

你可能感兴趣的:(java8获取两个list的交集和差集_Java8的Stream API的一些奇技淫巧)