Stream和lambda的常用api(上)

 

根据一组数据,先过滤,在排序,再取某个字段的值作为结果;此时该结果中还是基于某个字段排序后的顺序;

    /**
     * @author Young
     * @description 根据一组dish,获取该组dish中少于400卡的,并按照卡正序排列,取所有的dishName;
     * @date 14:37 2019/9/28
     * @param dishes	 入参描述说明
     * @return java.util.List<java.lang.String>
     **/
    public static List<String> getDishName(List<Dish> dishes){
        return dishes.stream()
                .filter(d->d.getCalories()<400)
                .sorted(Comparator.comparing(Dish::getCalories))
                .map(Dish::getName)
                .collect(Collectors.toList());
    }

 

通过实体类的某个字段进行分组

 

    /**
     * @author Young
     * @description 根据type进行分组
     * @date 14:51 2019/9/28
     * @param dishes	 入参描述说明
     * @return java.util.Map<java.lang.reflect.Type,java.util.List<co.solinx.kafka.monitor.db.Dish>>
     **/
    public static Map<Type,List<Dish>> getDishByType(List<Dish> dishes){
        Map<Type,List<Dish>> result = new HashMap();
        for (Dish dish : dishes) {
            if (result.containsKey(dish.getType())){
                result.get(dish.getType()).add(dish);
            }else {
                List<Dish>  dishList= new ArrayList<>();
                dishList.add(dish);
                result.put(dish.getType(),dishList);
            }
        }
        return result;
    }

    /**
     * @author Young
     * @description use stream to group
     * @date 14:58 2019/9/28
     * @param dishes	 入参描述说明
     * @return java.util.Map<co.solinx.kafka.monitor.db.Type,java.util.List<co.solinx.kafka.monitor.db.Dish>>
     **/
    public static Map<Type,List<Dish>> getDishByTypeStream(List<Dish> dishes){
        return dishes.stream().collect(Collectors.groupingBy(Dish::getType));
    }

代码的简洁性显而易见

 

Stream

流是从支持数据处理操作的源生成的元素序列,源可以是数组.文件.集合.函数.流不是集合元素,也不是数据结构,不能保存数据,主要目的就是在于流式计算.

五种生成流的方式

1,通过集合生成,应用中最常见的一种

Stream<Integer> stream = List.stream();

2,通过数组生成

IntStream stream = Arrays.stream(int[]);

通过Arrays.stream方法生成流,并且该方法生成的流是数值流[即IntStream]而不是Stream<Integer>.补充一点使用数值流可以避免计算过程中拆箱装箱,提高性能.

3,通过值生成

Stream<Integer> stram = Stream.of(1,2,3,4);

通过strem的of方法生成流,通过stram的empty方法可以生成一个空流.

4,通过文件生成

Stream<String> lines = Files.lines(Paths.get("data.txt"),Charset.defaultCharset())

通过Files.lines方法得到一个流,并且得到的每个流是给定文件中的一行

5通过函数生成,提供interate和generate两个静态方法从函数中生成流

Stream<Integer> stream = Stream.interate(0,n->n+2).limit(5);

iterate方法接收两个参数,第一个为初始化值,第二个为进行的函数操作,因为interator生成的流为无限流,通过limit方法对流进行截断,只生成5个偶数.

generate

Stream<Double> stream = Stream.generate(Math::random).limit(5)

generate方法接受一个参数,方法参数类型为supplier,由它为流提供值.generate生成的流也是无限流,因此需要limit对流截断

 

流的操作类型

见下文

摘自:https://mp.weixin.qq.com/s/x2BLSKiFakSD76FzFCBH7Q

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章