【发布时间】:2017-06-07 15:23:25
【问题描述】:
是否有任何键是正则表达式模式的 Map 的 Java 实现。这种数据结构有可能吗? 找到了几个手工解决方案,例如 https://wiki.apache.org/jakarta/RegexpKeyedMap,但我想要一个经过良好测试的库。
作为客户我想要这个
map.put('^RESOURCE.*', () -> { /* some action*/});
map.put('USER|ACCOUNT', () -> { /* do action*/}};
map.put('PRODUCT', () -> { /* do action */}};
例如
String entityType = 'RESOURCE_TYPE_1';
.....
Supplier<MyBatisMapper> action = mapers.get(entityType)
MyBatisMapper mapper = action.get();
mapper.update(entity);
它将用作静态配置。所以删除功能不是必需的。
已编辑
目前我们的项目中有几个大型交换机,任务是使条件更加复杂。喜欢(在伪代码中):
switch (type) {
case 'USER' || 'ACCOUNT' : doAction();
case startsWith('RESOURCE'): doAnotherAction();
...
/* another 10-15 cases */
}
我怀疑什么是最佳方法。有几个想法,但没有一个看起来不错:
- 用 if/else 改变开关
- 建议创建一些 RegEx 容器,例如 dimo414。
- 为配置创建一些类。这个问题看起来太复杂了。
我用 groovy 很容易地解决了这个问题,
def configuration = [
[matcher: { it.startsWith('RESOURCE' }, action: { /* */}],
[matcher: { it == 'USER' || it == 'ACCOUNT' }, action: { /* */}]
]
...
def result = configuration.find({ it.matcher(type)}).action();
但是对于 Java,这样的解决方案会太脏(由于类型转换)。
【问题讨论】:
-
要求我们推荐或查找书籍、工具、软件库、教程或其他非现场资源的问题对于 Stack Overflow 来说是题外话,因为它们往往会吸引固执己见的答案和垃圾邮件。
-
我肯定会避免使用
RegexpKeyedMap类型 - 它是 Java-6 之前的语法并且没有正确实现(例如,它没有实现containsKey()或putAll())。 -
"但是对于 Java,这样的解决方案会太脏(由于类型转换)" 我不明白你的意思,哪里是转换问题?使用
RegexLookup你会说configuration.putPattern("^RESOURCE.*", () -> ...);等等,然后使用configuration.find(someString);再次返回操作。您对V类型有疑问吗?使用Function或java.util.function中的其他类型之一。
标签: java regex dictionary data-structures