gpt4 book ai didi

java - 收集 HashSet/Java 8/Regex Pattern/Stream API

转载 作者:太空狗 更新时间:2023-10-29 22:59:30 26 4
gpt4 key购买 nike

最近我更改了 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 编写此代码?

最佳答案

如果您重用 JDK 提供的 Spliterators.AbstractSpliterator,基于 Matcher 的拆分器实现会非常简单:

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 = "kid@gmail.com, stray@yahoo.com, miks@tijuana.com";
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());

关于java - 收集 HashSet/Java 8/Regex Pattern/Stream API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24660888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com