我有以下代码段:
Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = a.compareTo(b) <= 0 ? a : b;
这类似于Math.min(a, b)
,但在Comparable
上定义。
我知道三元运算符已经很短了,但是我无法内联a
和b
的表达式,因此我认为min(a, b)
相对应。 max(a, b)
更容易理解。
我知道有几个流响应。一组值的收集函数,例如:
Stream.of(a, b).min(Comparator.naturalOrder())
这将有助于内联表达式,但是我仍然觉得很难阅读,并且对于这么小的任务而言,开销太大。
目前,我正在使用自己的实用程序功能,但我很感兴趣:
如何在不占用过多性能开销的情况下,以一种可读且与库无关的方式找到两个可比对象中的最小值?
答案 0 :(得分:2)
来自java.util.Collections
:Collections.max()
和Collections.min()
Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = Collections.min(Arrays.asList(a,b));
从org.apache.commons.lang3.ObjectUtils
到ObjectUtils.max()
和ObjectUtils.min()
Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = ObjectUtils.min(a, b);
Apache Commons开销较小,能够处理null
值,但这是第三方库。
答案 1 :(得分:1)
Collections
具有max(collection)
和min(collection)
方法,您可以按照自己的意愿进行操作。
除非将 Apache Commons 或 Guava 组合在一起,否则将整个新库仅用于内联一个简单操作可能是一个过大的杀伤力。
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;
}
答案 2 :(得分:0)
我创建了自己的帮助程序类,该类将Comparable
扩展为min
,max
,isLessThan
,isLessOrEqualTo
,isGreaterThan
和{ {1}}:
isGreaterOrEqualTo
我用于任何可比性的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;
}
}
和min
方法:
max
对于我自己的String first = "a";
String second = "b";
System.out.println(Ordered.min(first, second)); // Prints "a"
实现,我扩展了Comparable
并将其用于可读比较。对枚举非常有用:
Ordered
用法:
public enum Board implements Ordered<Board> {
NONE,
BREAKFAST,
HALF_BOARD,
FULL_BOARD,
ALL_INCLUSIVE
}