收集HashSet / Java 8 / Regex模式/流API

安东·多佐采夫(Anton Dozortsev)

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

马克·托波尼克(Marko Topolnik)

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Java 8 流收集

来自分类Dev

在集合上使用Java8流收集到HashSet中会导致“类型不匹配”错误

来自分类Dev

Java 8流收集集

来自分类Dev

JAVA-8流收集高级用法

来自分类Dev

从Java 8中的流收集同步的arraylist

来自分类Dev

java8流收集不同的列表

来自分类Dev

Java 8收集与减少

来自分类Dev

Java流API收集方法

来自分类Dev

为什么在Java 8中按顺序收集并行流

来自分类Dev

的java 8流收集最大对象,并通过不同的属性

来自分类Dev

使用 Java 8 流和收集器嵌套值

来自分类Dev

过滤器和使用Java 8个流收集嵌套的收集要素

来自分类Dev

Java 8 Stream API收集器问题

来自分类Dev

Java 8 Stream API收集器问题

来自分类Dev

Java 8流中间映射/收集到具有2个值的流

来自分类Dev

如何从列表<object>由对象采取多个域值与Java8流创建HashSet的?

来自分类Dev

将Java-8流收集到Guava ImmutableList的最佳方法

来自分类Dev

使用Java 8中的Lambda将流收集到HashMap中

来自分类Dev

如何在Java 8中从流中收集两个和

来自分类Dev

使用Java 8流收集到增值基于现有的键/值对的

来自分类Dev

Java8流:一个条件之后收集元素满足

来自分类Dev

我们可以收集从Java 8流两份名单?

来自分类Dev

收集列表<对象>地图<字符串,列表<对象>>中的Java 8中使用流

来自分类Dev

Java 8流-使用自定义收集器时发生NullPointerException

来自分类Dev

使用带有 java 8 流的自定义收集器时获取 ClassCastException

来自分类Dev

Java 8流api控件输出

来自分类Dev

从java 8流api创建列表

来自分类Dev

Java 8将HashSet转换为HashMap

来自分类Dev

Java 8-省略繁琐的收集方法