如何使用流API反转比较器顺序?

时间:2016-11-25 11:58:07

标签: string collections java-8 java-stream comparator

String obtained = transactions.stream()
    .map(Transaction::getTrader)
    .map(Trader::getName)
    .sorted(String::compareTo)
    .collect(Collectors.joining(","));

如果我想在不写特定Comparator<String>的情况下反转返回字符串中的自然字母顺序,我该怎么办,以便连接的字符串结果以名称&#39; z开始。&#39 ;,&#39; y ..&#39;,&#39; x ..&#39;等等?

2 个答案:

答案 0 :(得分:2)

在java中,像这样的东西可以解决这个问题:

String obtained = transactions.stream()
                  .map(Transaction::getTrader).map(Trader::getName)
                  .sorted(Comparator.reverseOrder())
                  .collect(Collectors.joining(","));

请注意,它的工作原理是因为String实现了Comparable Interface。

答案 1 :(得分:2)

只需按一个操作即可按相反顺序对集合进行排序。

String实现Comparable接口。 java.lang.Comparable#compareTo()javadoc表示它返回:

  

作为此对象的负整数,零或正整数            小于,等于或大于指定的对象

要改变收集顺序,您可以:

  1. [推荐] 使用 Comparator.reverseOrder javadoc

      

    返回一个比较器,它强加了反向排序   指定比较器。 (...)

    List<String> strings = Arrays.asList("a","b","d", "c", "e");
    reversedOrderedStrings = strings.stream()
                                .sorted(Comparator.reverseOrder())
                                .collect(Collectors.joining(","));
    
  2. 反转比较参数的顺序

    reversedOrderedStrings = strings.stream()
                                .sorted((s1, s2) ->  s2.compareTo(s1))
                                .collect(Collectors.joining(","));
    
  3. [不推荐] 更改compareTo()方法的符号。建议不要这样做,因为它可能导致Integer.MIN_VALUE

    的数字溢出
    reversedOrderedStrings = strings.stream()
                                .sorted((s1, s2) -> -s1.compareTo(s2))
                                .collect(Collectors.joining(","));
    
  4. 所有人的输出都是相同的:

    System.out.println(reversedOrderedStrings);
    e,d,c,b,a