我的字符串为“我是Java(*)的新手”
和我的实际字符串是我是Java 8的新手,我将从我的地图中获得一堆密钥,我需要在这里提取8个不匹配的部分
我的最终地图应该包含第一个字符串是键,值是不匹配的部分,我将如何在java 8中执行此操作
Pattern p =Pattern.compile("I am new to Java (*)");
map= map.entrySet()
.stream()
.filter(p -> p.getKey().contains("Java")&&p.getKey().matches("I am new to Java (*)"))
.collect(Collectors.toMap(p -> p.getKey(), p -> p.getValue()));
我正在使用下面的一个并且它打破了,有人可以建议吗?
我想要像
这样的东西Map<String, String> result=map.entrySet().stream().filter(k-> k.getKey().matches(test) && k.getKey().contains(test))
.collect(Collectors.toMap(k->k.getKey(), ::p.matcher().group(1)));
我能够使用两张地图实现它
Map<String, String> result = new HashMap<>();
map.forEach((k,v)->{
if(k.contains(test)) {
while(p.matcher(k).find()) {
result.put(k, p.matcher(k).group(1));
}
}
});
但我想在一张地图中
答案 0 :(得分:1)
如果我理解正确(并简化了你的例子):
String test = "I am new to Java 8 ";
String t = "I am new to Java (.*) ";
Map<String, String> map = new HashMap<>();
map.put(test, "value1");
map.put("some", "value2");
Map<String, String> result = map.entrySet()
.stream()
.filter(e -> !e.getKey().equals(e.getKey().replaceAll(t, "$1")))
.collect(Collectors.toMap(
e -> e.getKey().replaceAll(t, "$1"),
Entry::getValue));
答案 1 :(得分:0)
我将如何做到这一点:
Pattern p = Pattern.compile("I am new to Java (.*)");
Predicate<String> regexFilter = p.asPredicate();
Function<String,String> versionExtractor = str -> {
Matcher m = p.matcher(str);
if (m.find()) {
return m.group(1);
} else {
throw new IllegalArgumentException("It didn't match !"); // should never happen since we match beforehand
}
};
Map<String,String> result = inputMap.keySet()
.stream()
.filter(regexFilter)
.collect(Collectors.toMap(Function.identity(), versionExtractor));
如果我没有弄错的话,您遇到的问题是您无法在一个语句中将键映射到您的值,因为您需要先.matches
才能.group
。
我们已经习惯了单行lambda(由函数式编程的强大功能),我们有时会忘记它们是普通的Function
并且它们没有这样的限制。在这里,我使用{statements}
块定义了我的lambda,并且我将lambda影响到一个变量,我之后在流处理中可以引用该变量。我本可以在流操作中直接定义lambda,或者我也可以在不使用lambda表示法的情况下实现Function
。