转换Clojure';使用矢量作为java HashMap键的s映射

转换Clojure';使用矢量作为java HashMap键的s映射,java,dictionary,collections,clojure,Java,Dictionary,Collections,Clojure,我们正在将一些业务逻辑从Clojure迁移到Java。目前我正在研究两种方法,但第二种方法有问题 第一个是——我相信——将映射转换为向量,但只包括我们为其提供键的值(以及删除空值) (defn-spec vec[具有分类和标记类型的标记] (进入[](删除nil?(带有分类标记类型的地图标记))) 下面是我如何将其转换为Java代码的: private List specVec(地图标记分类,列表标记类型){ 列表=新的ArrayList(); 用于(字符串标记类型:标记类型){ String

我们正在将一些业务逻辑从Clojure迁移到Java。目前我正在研究两种方法,但第二种方法有问题

第一个是——我相信——将映射转换为向量,但只包括我们为其提供键的值(以及删除空值)

(defn-spec vec[具有分类和标记类型的标记]
(进入[](删除nil?(带有分类标记类型的地图标记)))
下面是我如何将其转换为Java代码的:

private List specVec(地图标记分类,列表标记类型){
列表=新的ArrayList();
用于(字符串标记类型:标记类型){
String value=tagsWithClassification.get(tagType);
if(值!=null){
列表。添加(值);
}
}
退货清单;
}
我发布这个,因为它在另一个方法中使用,但我可能会误解它的作用

另一个是以字符串向量作为键,字符串作为值的映射,但也有一些与过滤键相关的逻辑,但我认为这部分已经做对了

这是到目前为止我得到的java代码,但我一直在研究如何以一种好的方式将此映射转换为HashMap(因为ArrayList/LinkedList不是很好的建议,在HashMap中用作键)。或者我应该使用完全不同的方法/不同的结构?提前感谢:)

注意:只返回5个(4个不同的字符串和null)可能的值

第二种Java方法:

private String bookingModelFor(地图标记分类,列表标记类型){
列表标记名=新的ArrayList(Arrays.asList(“事件”、“产品”、“客户交易方向”、“r因子方向”);
List filteredTagValues=specVec(标记分类、标记名);
filteredTagValues.addAll(标记类型);
/*
缺失部分
*/
返回null;
}
第二个Clojure函数:

(针对[tag with classification&tag Type]的defn预订模型)
(获得{[:交易:目标:增加:香草]“阿斯特里德”
[:交易:目标:减少:香草]“玛雅”
[:贸易:集团:增加:香草]“伊莎贝尔”
[:贸易:集团:减少:香草]“月亮”
[:trade:perles plus:increase:call]“阿斯特里德”
[:trade:perles plus:increase:put]“Luna”
[:trade:perles plus:increase:kickout]“阿斯特里德”
[:trade:perles plus:reduce:call]“Maja”
[:trade:perles plus:reduce:put]“伊莎贝尔”
[:交易:市盈率加上:减少:踢出]“Maja”
[:trade:reverse perles plus:increase:call]“阿斯特里德”
[:交易:反向交易加上:增加:卖出]“月亮”
[:交易:反向佩雷斯加:增加:踢出]“阿斯特里德”
[:交易:反向交易加上:减少:调用]“Maja”
[:交易:反向交易加上:减少:卖出]“伊莎贝尔”
[:交易:反向交易加上:减少:踢出]“Maja”
[:trade:kig:rease:put]“阿斯特里德”
[:交易:基格:增加:开球]“马贾”
[:trade:kig:decrease:put]“Maja”
[:trade:kig:reduce:kickout]“阿斯特里德”
[:过期:目标:减少:香草]“玛雅”
[:过期:集团:减少:香草]“月亮”
[:expire:kig:reduce:put]“Maja”
[:expire:kig:reduce:kickout]“Astrid”
[:expire:perles plus:increase:put]“Maja”
[:expire:perles plus:increase:call]“伊莎贝尔”
[:过期:佩雷斯加:增加:取消]“伊莎贝尔”
[:过期:反向perles plus:增加:put]“Maja”
[:过期:反转perles plus:增加:呼叫]“Isabelle”
[:过期:反向perles plus:增加:取消]“Isabelle”
[:障碍突破:kig:踢出]“阿斯特里德”
[:障碍突破:佩雷斯加:踢出]“阿斯特里德”
[:股份调整:目标:r系数>=1:普通]“Maja”
[:份额调整:目标:r系数=1:普通]“Luna”
[:股份调整:集团:r系数=1:put]“Maja”
[:份额调整:kig:r-系数>=1:限位]“阿斯特里德”
[:股票调整:kig:r-factor=1:put]“Luna”
[:股票调整:佩雷斯加上:r系数>=1:开球]“阿斯特里德”
[:股票调整:佩雷斯加:r系数=1:开球]“阿斯特里德”

[:share adjustment:reverse perles plus:r-factor我假设这些标记的顺序并不重要。在这种情况下,您不会比遗留代码做得更好。请参见此

您可以将关键字替换为常规字符串,也可以使用Set而不是List来替换关键字。此外,由于这是常量数据,请将查找表存储在
static
成员中,以避免在每次调用时重新创建它。例如

A类{
静态映射lut=newhashmap(){{
put(新的HashSet(Arrays.asList(“x”,“y”),“foo”);
put(新的HashSet(Arrays.asList(“x”、“y”、“z”),“bar”);
}};
公共静态void main(字符串[]args){
System.out.println(lut.get(新的哈希集(Arrays.asList(“x”,“y”))));
}
}