首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过静态方法(功能接口)内联创建比较器的更简单的方法?

通过静态方法(功能接口)内联创建比较器的更简单的方法?
EN

Stack Overflow用户
提问于 2018-04-10 09:31:51
回答 5查看 531关注 0票数 3

因为Comparator<T>是一个功能接口,所以我可以这样做

代码语言:javascript
复制
Comparator<Instant> instantComparator = Instant::compareTo;

现在我可以逆转它了:

代码语言:javascript
复制
Comparator<Instant> instantComparatorReversed = instantComparator.reversed();

不过,我可以直接这样做:

代码语言:javascript
复制
Comparator<Instant> cannotDoThis = (Instant::compareTo).reversed();

这是有意义的,因为Instant::compareTo毕竟只是一种方法,在这种情况下,它就是这样的。只有这样才能做到这一点:

代码语言:javascript
复制
Comparator<Instant> instantComparatorReversedWithCast = ((Comparator<Instant>)Instant::compareTo).reversed();

也有

代码语言:javascript
复制
Comparator.<Instant>reverseOrder()

正如评论中提到的

代码语言:javascript
复制
Comparator.<Instant>naturalOrder().reversed()

现在的问题是:有没有比这更短、更漂亮的“内联”方式?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-04-10 09:43:20

您可以编写一个接受Comparator作为参数并将其反转的方法:

代码语言:javascript
复制
public static <T> Comparator<T> reverse(Comparator<T> comparator) {
    return comparator.reversed();
}

您可能会在一个充满实用方法的类中这样做,并静态地导入该方法。

然后你就可以:

代码语言:javascript
复制
reverse(Instant:compareTo)
票数 4
EN

Stack Overflow用户

发布于 2018-04-10 09:37:57

下面是一个更短但更丑的版本:

代码语言:javascript
复制
Comparator<Instant> c = (a, b) -> b.compareTo(a);

使用方法引用,您可以做的最好是第一个(没有进入真正丑陋的转换),所以您将不得不决定您想要简短还是可读性。

票数 3
EN

Stack Overflow用户

发布于 2018-04-10 10:12:53

如果Instant实现了Comparable,您可以简单地执行以下操作:

代码语言:javascript
复制
Comparator<Instant> c = Comparator.<Instant>naturalOrder().reversed();
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49750149

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档