分类器和下游和只使用分类器有什么区别

我是 Java 8 的新手,流式收集器试图了解两者之间的基本区别是什么?


因为这两个代码都产生了相同的结果。一个使用return groupingBy(classifier, toList());并返回 groupingBy(classifier, HashMap::new,downstream);


这是代码


public class Grouping {

    enum CaloricLevel { DIET, NORMAL, FAT };


    public static void main(String[] args) {

        System.out.println("Dishes grouped by type: " + groupDishesByType());

        System.out.println("Dish names grouped by type: " + groupDishNamesByType());

    }



    private static Map<Type, List<Dish>> groupDishesByType() {

        return Dish.menu.stream().collect(groupingBy(Dish::getType));

    }


    private static Map<Type, List<String>> groupDishNamesByType() {

        return Dish.menu.stream().collect(groupingBy(Dish::getType, mapping(Dish::getName, toList())));

    }

}

输出:


Dishes grouped by type: {MEAT=[pork, beef, chicken], OTHER=[french fries, rice, season fruit, pizza], FISH=[prawns, salmon]}

Dish names grouped by type: {MEAT=[pork, beef, chicken], OTHER=[french fries, rice, season fruit, pizza], FISH=[prawns, salmon]}

菜.java


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;

    }


    public enum Type {

        MEAT, FISH, OTHER

    }


    @Override

    public String toString() {

        return name;

    }

}


森栏
浏览 139回答 3
3回答

qq_遁去的一_1

在你的两个例子中.collect(groupingBy(Dish::getType)); .collect(groupingBy(Dish::getType,&nbsp;mapping(Dish::getName,&nbsp;toList())));返回值相同,因为您toString()在Dish类中的方法name仅返回。尝试向toString()mehtod 添加更多信息,您会看到不同之处。通常,groupingBy仅使用分类器允许对对象进行分组,就像在您的第一个示例中一样。但是goupingBy与分类器和下游一起使用可以让您对更多的对象进行分组,而不仅仅是您的对象。例如,您可以按类型对平均卡路里进行分组:.collect(groupingBy(Dish::getType,&nbsp;averagingInt(Dish::getCalories));&nbsp;&nbsp;//&nbsp;Map<Type,&nbsp;Double>或者找到每种类型热量最高的菜肴:.collect(groupingBy(Dish::getType,&nbsp;maxBy(Comparator.comparingInt(Dish::getCalories)));&nbsp;&nbsp;//&nbsp;Map<Type,&nbsp;Optional<Dish>>通常groupingBy用作双重分组的下游本身(按类型和是否是素食主义者):.collect(groupingBy(Dish::getType,&nbsp;groupingBy(Dish::isVegetarian));&nbsp;//&nbsp;Map<Type,&nbsp;Map<Boolean,&nbsp;List<Dish>>>

阿晨1998

如果这是问题因为这两个代码都产生了相同的结果。一种使用 return groupingBy(classifier, toList());&nbsp;并返回 groupingBy(classifier, HashMap::new, 下游);&nbsp;?groupingBy(函数分类器,下游收集器)不保证返回的 Map 的类型、可变性、可序列化性或线程安全性。groupingBy(功能分类器,供应商mapFactory,下游收集器)Collector 生成的 Map 是使用提供的工厂函数创建的。唯一的区别是当您使用groupingBy时创建mapFactory的Map是基于您的供应商逻辑(可能是自定义的、不可变的、同步的等。)

炎炎设计

两者的基本区别是什么?主要区别在于您在完成收集器之前的中间步骤中完成的映射。不过,您使用它们的方式不同的是.groupingBy一方面,您已将mapperanddownstream共同指定为:.collect(Collectors.groupingBy(Dish::getType,&nbsp; // classifier&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Collectors.mapping(Dish::getName,&nbsp; // mapper <<<< difference here&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Collectors.toList()))) // downstream另一方面,的默认实现groupingBy用于.collect(Collectors.groupingBy(Dish::getType))&nbsp;可以扩展为类似于以下的某种格式:.collect(Collectors.groupingBy(Dish::getType, // classifier&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Collectors.mapping(Function.identity(),&nbsp; // mapper&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;Collectors.toList()))); // downstream
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java