具有next()和get()

时间:2018-05-17 11:35:55

标签: collections java-8 iterator factory fluent

给出这样一个对象:

Matcher matcher = pattern.matcher(sql);

使用方式如下:

Set<String> matches = new HashSet<>();
while (matcher.find()) {
    matches.add(matcher.group());
}

我想用更像面向对象的东西替换这个while循环:

new Iterator<String>() {
    @Override
    public boolean hasNext() {
        return matcher.find();
    }

    @Override
    public String next() {
        return matcher.group();
    }
}

这样我就可以轻松地制作匹配流,坚持使用流畅的API等。

问题是,我不知道也找不到更简洁的方法来创建这个Stream或Iterator。像上面这样的匿名课程对我来说太冗长了。

我曾希望在jdk中找到类似IteratorFactory.from(matcher::find, matcher::group)StreamSupport.of(matcher::find, matcher::group)的内容,但到目前为止还没有运气。我毫不怀疑像apache commons或guava这样的库为此提供了一些东西,但是让我说我​​不能使用它们。

Streams或Iterators是否有方便的工厂在jdk中使用hasNext / next方法组合?

2 个答案:

答案 0 :(得分:1)

在java-9中,您可以通过以下方式完成:

\s\s*

在java-8中,你需要一个后端口,取自Holger's fabulous answer

修改

有一种方法btw ;可以合并Set<String> result = matcher.results() .map(MatchResult::group) .collect(Collectors.toSet()); System.out.println(result); ,如下所示:

tryAdvance

用法例如:

find/group

答案 1 :(得分:1)

我写的这门课程体现了我想在jdk中找到的东西。显然虽然它不存在。 eugene's accepted answer提供了一个java 9 Stream解决方案。

public static class SearchingIterator<T> implements Iterator<T> {
    private final BooleanSupplier advancer;
    private final Supplier<T> getter;

    private Optional<T> next;

    public SearchingIterator(BooleanSupplier advancer, Supplier<T> getter) {
        this.advancer = advancer;
        this.getter = getter;

        search();
    }

    private void search() {
        boolean hasNext = advancer.getAsBoolean();
        next = hasNext ? Optional.of(getter.get()) : Optional.empty();
    }

    @Override
    public boolean hasNext() {
        return next.isPresent();
    }

    @Override
    public T next() {
        T current = next.orElseThrow(IllegalStateException::new);
        search();
        return current;
    }
}

用法:

Matcher matcher = Pattern.compile("\\d").matcher("123");
Iterator<String> it = new SearchingIterator<>(matcher::find, matcher::group);