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

Tob*_*fke 5 java comparable

我有以下片段:

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)

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

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

如何以一种可读性和独立于库的方式找到两个可比对象中的最小值,而又没有太多的性能开销?

dig*_*ise 7

第三方解决方案

Collectionsmax(collection)min(collection)方法,哪种做你想做的。

将全新的库仅仅内联到一个简单的操作中可能是一种矫枉过正,除非您混合使用Apache CommonsGuava 。

手工制作

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)


azr*_*zro 6

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

    Comparable<C> a = ...;
    Comparable<C> b = ...;
    Comparable<C> min = Collections.min(Arrays.asList(a,b));
    
    Run Code Online (Sandbox Code Playgroud)

  1. 来自org.apache.commons.lang3.ObjectUtilsObjectUtils.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值,但是它是第三方库。


Tob*_*fke 5

我已经创建了自己的助手类,它扩展了ComparableminmaxisLessThanisLessOrEqualToisGreaterThanisGreaterOrEqualTo

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的minmax方法:

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)


M. *_*tin 5

自版本 30.0 起,Google Guava库具有Comparators.min和方法:Comparators.max

Comparable<C> min = Comparators.min(a, b);
Run Code Online (Sandbox Code Playgroud)