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