Java 如何使用流API按条件对行进行排序

Java 如何使用流API按条件对行进行排序,java,java-stream,Java,Java Stream,我学习流API,我有这个任务。我需要按照列表集合的长度顺序对其进行排序,如果几行的长度相同,则按字母顺序进行排序 我的代码: List<String> phones = new ArrayList<String>(); Collections.addAll(phones, "iPhone X", "Nokia 9", "Huawei Nexus 6P", "Samsung Galaxy S8", "LG G6", "Xiaomi MI6",

我学习流API,我有这个任务。我需要按照列表集合的长度顺序对其进行排序,如果几行的长度相同,则按字母顺序进行排序

我的代码:

List<String> phones = new ArrayList<String>();
    Collections.addAll(phones, "iPhone X", "Nokia 9", "Huawei Nexus 6P",
            "Samsung Galaxy S8", "LG G6", "Xiaomi MI6", "Sony Xperia Z5",
            "ASUS Zenfone 3", "Meizu Pro 6", "Heizu Pro 6",
            "Pixel 2");

phones.stream().sorted(Comparator.comparingInt(String::length).reversed()).forEach(System.out::println);
正如你看到的线

 Sony Xperia Z5
 ASUS Zenfone 3
和线路:

    Meizu Pro 6 
    Heizu Pro 6
但我的结果必须是:

Samsung Galaxy S8
Huawei Nexus 6P
ASUS Zenfone 3
Sony Xperia Z5
Heizu Pro 6
Meizu Pro 6 
Xiaomi MI6
iPhone X
Nokia 9
Pixel 2
LG G6
如何改进代码,使其在长度相同的情况下按字母顺序排序

我们如何在列表>中收集结果?其中
List添加到比较器链以创建二级排序顺序。当主要排序不足时,将应用此选项:

phones.stream()
      .sorted(Comparator.comparingInt(String::length).reversed()
                        .thenComparing(Function.identity()))
      .forEach(System.out::println);

Comparator.comparingInt(String::length).reversed()。然后比较(Comparator.naturalOrder())

Neat。我不知道有这样一个内置的比较器。
String::toString
而不是
String::compareTo
会工作吗?(真诚地询问)或
Function.identity()
,不确定什么是表达它的最佳方式。编辑我的答案以使用
Function.identity()
然后比较(Comparator.naturalOrder())
更有意义我相信我们如何在列表中收集结果?添加一些解释可能会有所帮助。可能会改进为
Comparator Comparator=(o1,o2)->o2.length()==o1.length()?o1.compareTo(o2):整数.compare(o2.length(),o1.length())
String a = Abcd;
list.add(new Pair(a, a.length));
phones.stream()
      .sorted(Comparator.comparingInt(String::length).reversed()
                        .thenComparing(Function.identity()))
      .forEach(System.out::println);
phones.stream()
      .sorted((a,b) -> b.length()-a.length() == 0? a.compareTo(b) : b.length()-a.length())
      .forEach(System.out::println);