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

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