最小/最大功能,具有两个可比性

时间:2018-07-10 13:00:40

标签: java comparable

我有以下代码段:

Comparable<C> a = ...;
Comparable<C> b = ...;
Comparable<C> min = a.compareTo(b) <= 0 ? a : b;

这类似于Math.min(a, b),但在Comparable上定义。

我知道三元运算符已经很短了,但是我无法内联ab的表达式,因此我认为min(a, b)相对应。 max(a, b)更容易理解。

我知道有几个流响​​应。一组值的收集函数,例如:

Stream.of(a, b).min(Comparator.naturalOrder())

这将有助于内联表达式,但是我仍然觉得很难阅读,并且对于这么小的任务而言,开销太大。

目前,我正在使用自己的实用程序功能,但我很感兴趣:

如何在不占用过多性能开销的情况下,以一种可读且与库无关的方式找到两个可比对象中的最小值?

3 个答案:

答案 0 :(得分:2)

  1. 来自java.util.CollectionsCollections.max()Collections.min()

    Comparable<C> a = ...;
    Comparable<C> b = ...;
    Comparable<C> min = Collections.min(Arrays.asList(a,b));
    

  1. org.apache.commons.lang3.ObjectUtilsObjectUtils.max()ObjectUtils.min()

    Comparable<C> a = ...;
    Comparable<C> b = ...;
    Comparable<C> min = ObjectUtils.min(a, b);
    

Apache Commons开销较小,能够处理null值,但这是第三方库。

答案 1 :(得分:1)

3 rd 参与者解决方案

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扩展为minmaxisLessThanisLessOrEqualToisGreaterThan和{ {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
}