使用Groovy与Java中的自定义键映射

时间:2016-07-08 12:33:20

标签: java groovy

我想在Groovy中使用一个映射,其中键将是不可变类的实例。

这是我经常用Java做的事情,它可以正常工作,就像在这个示例类中一样:

public class TestMap {
    static final class Point {
        final int x; final int y;
        public Point(int x, int y) {this.x = x;this.y = y;}
    }

    public static void main(String[] args) {
        Map<Point, String> map = new HashMap<>();
        final Point origin = new Point(0, 0);
        map.put(origin, "hello world !" );
        if(!map.containsKey(origin))
            throw new RuntimeException("can't find key origin in the map");
        if(!map.containsKey(new Point(0,0))) {
            throw new RuntimeException("can't find new key(0,0) in the map");
        }
    }
}

但是当我尝试用Groovy实现同样的功能时,它并不起作用。 为什么? 以下是Groovy中的一个非工作示例示例:

class Point { 
    final int x; final int y
    Point(int x, int y) { this.x = x; this.y = y }
    public String toString() { return "{x=$x, y=$y}" }
}

def origin = new Point(0, 0)
def map = [(origin): "hello"] 
map[(new Point(1,1))] = "world"
map.put(new Point(2,2),  "!")

assert map.containsKey(origin) // this works: when it's the same ref
assert map.containsKey(new Point(0,0))
assert map.containsKey(new Point(1,1))
assert map.containsKey(new Point(2,2))
assert !map.containsKey(new Point(3,3))

1 个答案:

答案 0 :(得分:5)

您需要在equals类上使用hashCodePoint方法,以便可以在HashMap

中找到实例作为键

您可以通过在Groovy中添加注释来快速完成此操作:

import groovy.transform.*

@EqualsAndHashCode
class Point { 
    final int x; final int y
    Point(int x, int y) { this.x = x; this.y = y }
    public String toString() { return "{x=$x, y=$y}" }
}