最近,我更改了项目的JDK 8而不是版本7,现在我使用Java 8附带的新功能覆盖了一些代码段。
final Matcher mtr = Pattern.compile(regex).matcher(input);
HashSet<String> set = new HashSet<String>() {{
while (mtr.find()) add(mtr.group().toLowerCase());
}};
如何使用Stream API编写此代码?
Matcher
如果重复使用JDK提供的,基于A的分离器实现可能非常简单Spliterators.AbstractSpliterator
:
public class MatcherSpliterator extends AbstractSpliterator<String[]>
{
private final Matcher m;
public MatcherSpliterator(Matcher m) {
super(Long.MAX_VALUE, ORDERED | NONNULL | IMMUTABLE);
this.m = m;
}
@Override public boolean tryAdvance(Consumer<? super String[]> action) {
if (!m.find()) return false;
final String[] groups = new String[m.groupCount()+1];
for (int i = 0; i <= m.groupCount(); i++) groups[i] = m.group(i);
action.accept(groups);
return true;
}
}
请注意,分隔符提供所有匹配器组,而不仅仅是完整匹配。另请注意,此分离器支持并行性,因为它AbstractSpliterator
实现了分离策略。
通常,您将使用便利流工厂:
public static Stream<String[]> matcherStream(Matcher m) {
return StreamSupport.stream(new MatcherSpliterator(m), false);
}
这为您简洁地编写各种复杂的面向正则表达式的逻辑提供了强大的基础,例如:
private static final Pattern emailRegex = Pattern.compile("([^,]+?)@([^,]+)");
public static void main(String[] args) {
final String emails = "[email protected], [email protected], [email protected]";
System.out.println("User has e-mail accounts on these domains: " +
matcherStream(emailRegex.matcher(emails))
.map(gs->gs[2])
.collect(joining(", ")));
}
哪些印刷品
User has e-mail accounts on these domains: gmail.com, yahoo.com, tijuana.com
为了完整起见,您的代码将被重写为
Set<String> set = matcherStream(mtr).map(gs->gs[0].toLowerCase()).collect(toSet());
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句