A Spliterator for MatchResults in Java

I recently needed to iterate over the MatchResult of a Matcher, so I have implemented an AbstractSpliterator for it.

// Copyright (c) Philipp Wagner. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.

import java.util.Spliterators;
import java.util.function.Consumer;
import java.util.regex.MatchResult;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class MatchSpliterator extends Spliterators.AbstractSpliterator<MatchResult> {

    private Matcher matcher;

    public MatchSpliterator(Matcher matcher) {
        super(Long.MAX_VALUE, NONNULL | ORDERED);

        this.matcher = matcher;

    public boolean tryAdvance(Consumer<? super MatchResult> action) {
        if(matcher.find()) {
            return true;
        return false;

    public static Stream<MatchResult> stream(String regex, String input) {
        return stream(Pattern.compile(regex), input);

    public static Stream<MatchResult> stream(Pattern pattern, String input) {
        return stream(pattern.matcher(input));

    public static Stream<MatchResult> stream(Matcher matcher) {
        return StreamSupport.stream(new MatchSpliterator(matcher), false);