我正在将字符串列表与关键字列表进行匹配。目标是,如果字符串中包含任何关键字,则只获取一次。
实际上我是用这个循环来做的:
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!