美文网首页
stream API获取列表前三个最大值

stream API获取列表前三个最大值

作者: 源码互助空间站 | 来源:发表于2019-12-16 14:33 被阅读0次

    一、前言

    获取一个列表前三最大热量的食品名称。
    参考:《JAVA 8实战》第四章

    二、准备代码

    2.1先准备食品Bean类

    public class Dish {
        private final String name;
        private final boolean vegetarian;
        private final int calories;
        private final Type type;
        public Dish(String name, boolean vegetarian, int calories, Type type) {
            this.name = name;
            this.vegetarian = vegetarian;
            this.calories = calories;
            this.type = type;
        }
        public String getName() {
            return name;
        }
        public boolean isVegetarian() {
            return vegetarian;
        }
        public int getCalories() {
            return calories;
        }
        public Type getType() {
            return type;
        }
        @Override
        public String toString() {
            return name;
        }
        public enum Type { MEAT, FISH, OTHER }
    }
    

    三、筛选代码

    public static void main(String[] args) {
            List<Dish> menu = Arrays.asList(
            new Dish("pork", false, 800, Dish.Type.MEAT),
                    new Dish("beef", false, 700, Dish.Type.MEAT),
                    new Dish("chicken", false, 400, Dish.Type.MEAT),
                    new Dish("french fries", true, 530, Dish.Type.OTHER),
                    new Dish("rice", true, 350, Dish.Type.OTHER),
                    new Dish("season fruit", true, 120, Dish.Type.OTHER),
                    new Dish("pizza", true, 550, Dish.Type.OTHER),
                    new Dish("prawns", false, 300, Dish.Type.FISH),
                    new Dish("salmon", false, 450, Dish.Type.FISH));
    
            //选出高热量的菜肴,获取菜名,前三个
            List<String> collect = menu.stream().filter(dish -> dish.getCalories() > 300)
                    .map(Dish::getName)
                    .limit(3)
                    .collect(Collectors.toList());
            System.out.println(collect.toString());
        }
    

    返回结果:
    [pork, beef, chicken]

    四、原理

    1. filter——接受Lambda,从流中排除某些元素。在本例中,通过传递lambda d ->
      d.getCalories() > 300,选择出热量超过300卡路里的菜肴。
    2. map——接受一个Lambda,将元素转换成其他形式或提取信息。在本例中,通过传递方
      法引用Dish::getName,相当于Lambda d -> d.getName(),提取了每道菜的菜名。
    3. limit——截断流,使其元素不超过给定数量。
    4. collect——将流转换为其他形式。


      图片.png

    相关文章

      网友评论

          本文标题:stream API获取列表前三个最大值

          本文链接:https://www.haomeiwen.com/subject/bofdnctx.html