需要一种方法来获取与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返回布尔值

使用.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的一个不那么花哨的替代品,在Java 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!