0

我目前正在使用不可变对象来构造具体对象。我在尝试创建TreeMultiMap.

错误:它期望在OrderKey创建地图时进行比较,如何使用不可变对象设置比较器来创建TreeMultiMap

//Does not compile here
SortedSetMultimap<ImmutableOrderKey, ImmutableOrder > orderMap= TreeMultimap.create();


@Value.Immutable
interface OrderKey {
    long orderNum();
}


@Value.Immutable
  interface Order {
  long orderNum();
  DateTime orderDate();
  String deliveryAddress();
}
4

1 回答 1

2

一种解决方案是确保您的不可变对象实现Comparable接口。

如果您使用的是 Java 8,则可以使用默认方法来实现:

@Value.Immutable
interface OrderKey extends Comparable<OrderKey> {
    long orderNum();

    default int compareTo(OrderKey o) {
        return orderNum() - o.orderNum();
    }
}

如果您是 Java 8 之前的版本,请考虑使用抽象类而不是接口来实现相同的效果。


另一种方法(同样是 java 8)是为创建方法提供比较器,例如:

Comparator<OrderKey> orderKeyCmp = Comparator.comparingLong(OrderKey::orderNum);
Comparator<Order> orderCmp = Comparator.comparing(Order::orderDate);

SortedSetMultimap<ImmutableOrderKey, ImmutableOrder> orderMap 
    = TreeMultimap.create(orderKeyCmp, orderCmp);

以上将根据字段对OrderKey实例进行排序orderNum,并Order根据字段对实例进行排序orderDate

于 2017-10-19T12:19:02.060 回答