java - 像切换条件一样对 Java Stream 进行排序

标签 java collections functional-programming java-8 java-stream

我正在尝试按其中一个字段的特定顺序对流进行排序。

现在我通过将流转换为列表并使用开关然后将它们重新加入到所需顺序的列表中来实现这一点。


    fruits.forEach(fruit -> {
                switch (fruit.getName()) {
                    case "Orange":
                        orangesList.add(fruit);
                        break;
                    case "Apple":
                        applesList.add(fruit);
                        break;
                    case "WaterMelon":
                        watermelonList.add(fruit);
                        break;
                    default:
                        otherFruits.add(fruit);
                        break;
                }
    });

    genericFruitList.addAll(0, orangeList);
    genericFruitList.addAll(1, applesList);
    genericFruitList.addAll(2, watermelonList);
    genericFruitList.addAll(3, otherFruits);

我想知道是否有任何更改可以使用流排序方法实现此目的 并使用自定义比较器或类似的东西。

提前致谢。

最佳答案

您可以使用像这样的显式顺序创建比较器

List<String> order = Arrays.asList("Orange", "Apple", "WaterMelon");
Comparator<String> comp
    = Comparator.comparingInt(name -> order.indexOf(name)-Integer.MIN_VALUE);

可以像这样使用

List<Fruit> genericFruitList = fruits
    .sorted(Comparator.comparing(fruit -> fruit.getName(), comp))
    .collect(Collectors.toList());

但是,对整个列表进行排序,尤其是使用基于 List.indexOf 的比较器时,效率可能非常低。另一种选择是

List<Fruit> genericFruitList = fruits
    .collect(Collectors.groupingBy(fruit -> fruit.getName()))
    .entrySet().stream()
    .sorted(Map.Entry.comparingByKey(comp))
    .flatMap(e -> e.getValue().stream())
    .collect(Collectors.toList());

它只是对每个 Fruit 执行哈希查找,并且只对不同的映射进行排序。

这可以看作是 Bucket Sort 的变体.

关于java - 像切换条件一样对 Java Stream 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46115829/

相关文章:

Java 加倍奇怪(不,这不是为了钱)

java - java中的 map 问题

Python:在多维数组/列表上使用不带 lambda 的 map()

java - 将使用 SOAP 从 (C# .net) Web 服务接收的对象转换为 Android 中的字符串数组

java - 在 Maven 中解析或编译循环依赖

objective-c - objC 中的 initWith 与 arrayWith?

list - 在 Erlang 中获取衍生函数的结果

haskell - Haskell 和 F# 之间的主要区别是什么?

java - 在 JButton 子级中实现 ActionListener

Java 集合和映射