Java 具有两个可比较参数的最小/最大函数
我得到了以下片段:Java 具有两个可比较参数的最小/最大函数,java,comparable,Java,Comparable,我得到了以下片段: Comparable<C> a = ...; Comparable<C> b = ...; Comparable<C> min = a.compareTo(b) <= 0 ? a : b; 这将有助于内联表达式,但对于这样一个小任务,我仍然发现它很难阅读,而且开销有点太大 目前我正在使用我自己的效用函数,但我感兴趣的是: 如何以可读且独立于库的方式找到两个可比较的最小值,而不需要太多的性能开销 从java.util.Collecti
Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = a.compareTo(b) <= 0 ? a : b;
这将有助于内联表达式,但对于这样一个小任务,我仍然发现它很难阅读,而且开销有点太大
目前我正在使用我自己的效用函数,但我感兴趣的是:
如何以可读且独立于库的方式找到两个可比较的最小值,而不需要太多的性能开销
java.util.Collections
:和
null
值,但它是一个第三方库。第三方解决方案
Collections
有max(collection)
和min(collection)
方法,它们是您想要的方法
将整个新库仅仅内联到一个简单的op中可能是一种过激的行为,除非您的组合中有apachecommons或Guava
手工制作
publicmax(ta,tb){
返回a.compareTo(b)>=0?a:b;
}
公共T min(ta,tb){
返回a.compareTo(b)<0?a:b;
}
我创建了自己的helper类,它通过min
、max
、isLessThan
、isLessOrEqualTo
、IsgreaterEqualto
和IsgreaterEqualto
扩展了Compariable
:
public interface Ordered<T> extends Comparable<T> {
static <T extends Comparable<T>> T min(T a, T b) {
return a.compareTo(b) <= 0 ? a : b;
}
static <T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) >= 0 ? a : b;
}
default boolean isLessThan(T other) {
return compareTo(other) < 0;
}
default boolean isLessOrEqualTo(T other) {
return compareTo(other) <= 0;
}
default boolean isGreaterThan(T other) {
return compareTo(other) > 0;
}
default boolean isGreaterOrEqualTo(T other) {
return compareTo(other) >= 0;
}
}
对于我自己的Comparable
实现,我扩展了Ordered
,并将其用于可读的比较。非常有助于枚举:
public enum Board implements Ordered<Board> {
NONE,
BREAKFAST,
HALF_BOARD,
FULL_BOARD,
ALL_INCLUSIVE
}
Guava有一个,但推荐了另一个(更详细的)Java 8替代方案:要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于堆栈溢出来说是离题的,因为它们往往会吸引固执己见的答案和垃圾邮件。我将问题从“是否存在”改为“如何”,这将导致相同的答案,但希望阻止这样的标志。。。
Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = ObjectUtils.min(a, b);
public <T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) >= 0 ? a : b;
}
public <T extends Comparable<T>> T min(T a, T b) {
return a.compareTo(b) < 0 ? a : b;
}
public interface Ordered<T> extends Comparable<T> {
static <T extends Comparable<T>> T min(T a, T b) {
return a.compareTo(b) <= 0 ? a : b;
}
static <T extends Comparable<T>> T max(T a, T b) {
return a.compareTo(b) >= 0 ? a : b;
}
default boolean isLessThan(T other) {
return compareTo(other) < 0;
}
default boolean isLessOrEqualTo(T other) {
return compareTo(other) <= 0;
}
default boolean isGreaterThan(T other) {
return compareTo(other) > 0;
}
default boolean isGreaterOrEqualTo(T other) {
return compareTo(other) >= 0;
}
}
String first = "a";
String second = "b";
System.out.println(Ordered.min(first, second)); // Prints "a"
public enum Board implements Ordered<Board> {
NONE,
BREAKFAST,
HALF_BOARD,
FULL_BOARD,
ALL_INCLUSIVE
}
Board requestedBoard = ...;
Board availableBoard = ...;
if (requestedBoard.isLessOrEqualTo(availableBoard)) {
...
}