Java 使用不可变对象创建TreeMultimap

Java 使用不可变对象创建TreeMultimap,java,guava,immutables-library,Java,Guava,Immutables Library,我目前正在使用它来构造具体的对象。 我在尝试创建TreeMultiMap时遇到了一个问题 错误:在创建映射时,需要在OrderKey中有一个可比较的, 如何使用不可变项设置比较器以创建TreeMultiMap //Does not compile here SortedSetMultimap<ImmutableOrderKey, ImmutableOrder > orderMap= TreeMultimap.create(); @Value.Immutable interface

我目前正在使用它来构造具体的对象。 我在尝试创建
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();
}
//不在此处编译
SortedSetMultimap orderMap=TreeMultimap.create();
@值。不可变
接口顺序键{
长orderNum();
}
@值。不可变
接口顺序{
长orderNum();
DateTime orderDate();
字符串deliveryAddress();
}

一个解决方案是确保不可变对象实现
可比较的
接口

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

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

    default int compareTo(OrderKey o) {
        return orderNum() - o.orderNum();
    }
}
@Value.Immutable
接口OrderKey扩展了可比性{
长orderNum();
默认整数比较对象(OrderKey o){
返回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);
Comparator orderKeyCmp=Comparator.comparingLong(OrderKey::orderNum);
Comparator orderCmp=Comparator.comparing(顺序::orderDate);
SortedSetMultimap orderMap
=TreeMultimap.create(orderKeyCmp,orderCmp);

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

一种解决方案是确保不可变对象实现
可比较的
接口

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

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

    default int compareTo(OrderKey o) {
        return orderNum() - o.orderNum();
    }
}
@Value.Immutable
接口OrderKey扩展了可比性{
长orderNum();
默认整数比较对象(OrderKey o){
返回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);
Comparator orderKeyCmp=Comparator.comparingLong(OrderKey::orderNum);
Comparator orderCmp=Comparator.comparing(顺序::orderDate);
SortedSetMultimap orderMap
=TreeMultimap.create(orderKeyCmp,orderCmp);

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

排序后的映射意味着对其键使用某种排序。您需要指定应该是什么顺序。同意,当我使用不可变时,如何指定这个顺序?如何指定我的OrderKey应该使用某个比较器。equals和hashcode方法是在ImmutableOrderKey类中实现的。我不明白为什么它是不可变的这一事实是相关的。编写一个
比较器
。有很多资源描述了如何做到这一点。您正在寻找吗?排序映射意味着对其键使用某种顺序。您需要指定应该是什么顺序。同意,当我使用不可变时,如何指定这个顺序?如何指定我的OrderKey应该使用某个比较器。equals和hashcode方法是在ImmutableOrderKey类中实现的。我不明白为什么它是不可变的这一事实是相关的。编写一个
比较器
。有很多资源描述如何做到这一点。你在寻找吗?