我有以下片段:
Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = a.compareTo(b) <= 0 ? a : b;
Run Code Online (Sandbox Code Playgroud)
这类似于Math.min(a, b),但在上定义Comparable。
我知道三元运算符已经很短了,但是我无法内联aand 的表达式,b因此我认为是min(a, b)。max(a, b)更容易理解。
我知道有几个流响应。收集一组值的函数,例如:
Stream.of(a, b).min(Comparator.naturalOrder())
Run Code Online (Sandbox Code Playgroud)
这将有助于内联表达式,但是对于这样的小任务,我仍然觉得很难阅读并且开销太大。
目前,我正在使用自己的实用程序功能,但我很感兴趣:
如何以一种可读性和独立于库的方式找到两个可比对象中的最小值,而又没有太多的性能开销?
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;
}
Run Code Online (Sandbox Code Playgroud)
来自java.util.Collections: Collections.max()和Collections.min()
Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = Collections.min(Arrays.asList(a,b));
Run Code Online (Sandbox Code Playgroud)来自org.apache.commons.lang3.ObjectUtils:ObjectUtils.max()和ObjectUtils.min()
Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = ObjectUtils.min(a, b);
Run Code Online (Sandbox Code Playgroud)Apache Commons具有较少的开销,并且能够处理null值,但是它是第三方库。
我已经创建了自己的助手类,它扩展了Comparable由min,max,isLessThan,isLessOrEqualTo,isGreaterThan和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;
}
}
Run Code Online (Sandbox Code Playgroud)
我用于任何 Comparable的min和max方法:
String first = "a";
String second = "b";
System.out.println(Ordered.min(first, second)); // Prints "a"
Run Code Online (Sandbox Code Playgroud)
对于我自己的实现,Comparable我扩展Ordered并使用该实现进行可读比较。对枚举非常有帮助:
public enum Board implements Ordered<Board> {
NONE,
BREAKFAST,
HALF_BOARD,
FULL_BOARD,
ALL_INCLUSIVE
}
Run Code Online (Sandbox Code Playgroud)
用法:
Board requestedBoard = ...;
Board availableBoard = ...;
if (requestedBoard.isLessOrEqualTo(availableBoard)) {
...
}
Run Code Online (Sandbox Code Playgroud)
自版本 30.0 起,Google Guava库具有Comparators.min和方法:Comparators.max
Comparable<C> min = Comparators.min(a, b);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1247 次 |
| 最近记录: |