java - 使用 Immutable 对象创建 TreeMultimap

标签 java guava immutables-library

我目前正在使用immutables构造具体的物体。 我在尝试创建 TreeMultiMap 时遇到问题。

错误:它需要 OrderKey 中的可比项来创建 map , 如何使用不可变值设置比较器来创建 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();
}

最佳答案

一种解决方案是确保您的 Immutable 对象实现 Comparable 接口(interface)。

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

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

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

如果您是 java 8 之前的版本,请考虑使用抽象类而不是接口(interface)来达到相同的效果。

<小时/>

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

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

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

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

关于java - 使用 Immutable 对象创建 TreeMultimap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46670622/

相关文章:

java - 使用Optional验证输入法参数

java - 用于处理范围列表的库

java - 包含列表的不可变类在没有列表的情况下构建时不会抛出异常

java - 账户利息计算器 : How to Pass Array Value to an Object?

java - for 循环条件中的不等于与不等式 - 在 Java 中

java - 解析 C 和 Java 以在我的网站上显示代码

java - 我如何在 JAVA 中进行查询/检索?

java - 在有限大小的 MAP 中添加和删除

java - 不可变中的可变项