如何使用流 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 文件