如何使用流 API 反转比较器顺序? [复制]

Posted

技术标签:

【中文标题】如何使用流 API 反转比较器顺序? [复制]【英文标题】:How to reverse comparator order using stream API? [duplicate] 【发布时间】:2017-04-09 19:53:43 【问题描述】:
String obtained = transactions.stream()
    .map(Transaction::getTrader)
    .map(Trader::getName)
    .sorted(String::compareTo)
    .collect(Collectors.joining(","));

如果我想在返回的字符串中反转自然字母顺序而不写特定的Comparator<String>,我该怎么办,以便连接的字符串结果以名称'z..','y..'开头, 'x..' 等等?

【问题讨论】:

【参考方案1】:

在java中,这样的事情可以解决问题:

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

请注意,它之所以有效,是因为 String 实现了 Comparable 接口。

【讨论】:

这就是我所期待的!谢谢,TDRS 我想你的意思是Comparator.reverseOrder()而不是Collection【参考方案2】:

只需一次操作即可对集合进行倒序排序。

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

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

要颠倒收集顺序,您可以:

    [推荐] 使用 Comparator.reverseOrder (javadoc) 其中

    返回一个比较器,该比较器对 指定的比较器。 (...)

    List<String> strings = Arrays.asList("a","b","d", "c", "e");
    reversedOrderedStrings = strings.stream()
                                .sorted(Comparator.reverseOrder())
                                .collect(Collectors.joining(","));
    

    反转比较参数的顺序

    reversedOrderedStrings = strings.stream()
                                .sorted((s1, s2) ->  s2.compareTo(s1))
                                .collect(Collectors.joining(","));
    

    [不推荐]更改 compareTo() 方法的符号。不建议这样做,因为它会导致 Integer.MIN_VALUE 的数值溢出

    reversedOrderedStrings = strings.stream()
                                .sorted((s1, s2) -> -s1.compareTo(s2))
                                .collect(Collectors.joining(","));
    

所有的输出都是一样的:

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

【讨论】:

您是对的,但问题是不要编写自己的比较器。我承认你的方法更快,必须使用。 是的,我知道我能做到,我正在寻找 Collection.reverseOrder() 方法。 我应该在我的答案中使用“sorted(Comparator.reverseOrder())”,如Reverse a comparator in Java 8中所述。 @Holger - 更正了答案。感谢您的评论。

以上是关于如何使用流 API 反转比较器顺序? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 node.js 顺序读取 csv 文件(使用流 API)

从 DynamoDB 流复制到 Kinesis Data Streams 时如何维护顺序并避免重复记录?

从 csv 文件中逐块读取和反转数据并复制到新的 csv 文件

如何反转连接顺序以使用子查询与 sqlalchemy 正确连接?

如何反转文件中的行顺序?

如何在 HashMap 中保留插入顺序? [复制]