需要一种方法来获取与 List.stream().anyMatch() 匹配的字符串中的模式

Need a way to get to get the pattern in a string matched with List.stream().anyMatch()

我正在将字符串列表与关键字列表进行匹配。目标是只获取一次包含任何关键字的字符串。

实际上我是用这个循环来做的:

for (int i = 0; i < keywords.size(); i++) {
   if (text.toLowerCase().contains(keywords.get(i))) {
      System.out.println("keyword >>> " + keywords.get(i)
         + " text >>> " + text);
      break;
   }
}

我想知道如果我像这样使用 java 流 API 是否有办法获取关键字:

if (keywords.stream().anyMatch(text.toLowerCase()::contains)) {
   System.out.println("keyword >>> " + "how to get the keyword here"
         + " text >>> " + text);
}

anyMatch returns 布尔值

使用 .filter() & findFirst() 您可以检索一个值。请注意,如果您使用 findFirst(),您会得到一个 Optional<String>,并且可以像这样使用 ifPresent()

keywords.stream()
    .filter(keyword -> text.toLowerCase().contains(keyword))
    .findFirst()
    .ifPresent(keyWord -> System.out.println("[2] keyword >>> " + keyWord + " text >>> " + text));

Optional.isPresent() & Optional.get():

Optional<String> firstKey = keywords.stream()
    .filter(keyword -> text.toLowerCase().contains(keyword))
    .findFirst();

if (firstKey.isPresent()) {
    System.out.println("[2] keyword >>> " + firstKey.get() + " | text >>> " + text);
}

作为 stream 的替代品,for 1.6+

中有更好的 for 语法
for(String keyword: keywords) {
    if (text.toLowerCase().contains(keyword)) {
        System.out.println("keyword >>> " + keyword
                + "text >>> " + text);
        break;
    }
}

我发现 for 语法比 stream 语法更容易阅读。在之前的工作中,我用 BOOST 做了很多 C++ lambda 函数,代码很难解析,错误也很难追踪。

另一种选择是在未找到关键字时打印信息性消息。这很容易通过将 isPresent 测试移到 print 语句中来完成。

List<String> keywords =
        Arrays.asList("now", "is", "the", "time");
String text = "what are your names?";
        
Optional<String> opt = keywords.stream()
            .filter(keyword -> text
                    .toLowerCase().contains(keyword))
            .findFirst();


System.out.println(!opt.isPresent() ? "No keyword was found!" : 
                                "keyword >>> " + opt.get() 
                                        + " text >>> " + text);

版画

No keyword was found!