使用Immutable对象创建TreeMultimap

时间:2017-10-10 15:32:33

标签: java guava immutables-library

我目前正在使用immutables来构建具体对象。 我在尝试创建TreeMultiMap时面临一个问题。

错误:期望在OrderKey中创建地图, 如何使用immutables设置比较器以创建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();
}

1 个答案:

答案 0 :(得分:2)

一种解决方案是确保您的Immutable对象实现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个实例进行排序。