簡體   English   中英

從字符串 java 8 中獲取不匹配的部分

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM