Как связать оператор космического корабля groovy для многоуровневой сортировки?

В Groovy есть оператор космического корабля <=>, который обеспечивает простой способ реализации сравнений. Как я могу связать его более плавным образом, чем код ниже? В этом примере я хочу сначала сравнить товары по цене, а затем по имени, если они имеют одинаковую цену.


class Item implements Comparable {
  int price
  String name

  int compareTo(Item other) {
    int result = price <=> other.price
    if (result == 0) {
      result = name <=> other.name
    }
    return result
  }
}

person Leonard Brünings    schedule 10.01.2014    source источник


Ответы (1)


Поскольку оператор космического корабля <=> возвращает 0, если оба равны, а 0 ложно в соответствии с Groovy Truth, вы можете использовать оператор elvis ?: для эффективной цепочки критериев сортировки.


class Item implements Comparable {
  int price
  String name

  int compareTo(Item other) {
    price <=> other.price ?: name <=> other.name
  }
}
person Leonard Brünings    schedule 10.01.2014