[英]get unmatched portion from string java 8
我的字符串為“我是 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));
}
}
});
但我想在一張地圖上
如果我理解正確(並稍微簡化了您的示例):
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));
這是我將如何做到的:
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
。
我們太習慣於單行 lambdas(通過函數式編程的力量啟用),以至於我們有時會忘記它們是普通的舊Function
並且它們沒有這樣的限制。 在這里,我使用{statements}
塊定義了我的 lambda,並將該 lambda 影響為一個變量,我可以稍后在我的流處理中引用該變量。 我可以直接在流操作中定義 lambda,或者我也可以在不使用 lambda 符號的情況下實現一個Function
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.