DulcetAirman icon

PatternStream.java

DulcetAirman | PRO | 02/21/22 12:38:00 PM UTC (Edited) | 0 ⭐ | 538 👁️ | Never ⏰ | []
Java |

2.28 KB

|

None

|

0 👍

/

0 👎

package ch.claude_martin;
 
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
 
/** Utility class that allows you to easily process all matches using a Java Stream. */
public class PatternStream {
    public static void main(String[] args) {
        // Simple example:
        String pattern = "\\p{Alpha}+(\\d+)";
        String text = "xxx foo42 %&ç bar789, zebra end.";
        Stream<String> match = match(pattern, text, m -> "#" + m.group(1));
        match.forEach(System.out::println);
    }
 
    public static Stream<String> match(Pattern pattern, CharSequence input) {
        return match(pattern, input, m -> m.group(0));
    }
 
    public static Stream<String> match(String pattern, CharSequence input) {
        return match(Pattern.compile(pattern), input, m -> m.group(0));
    }
 
    public static <T> Stream<T> match(String pattern, CharSequence input, Function<? super Matcher, ? extends T> fn) {
        return match(Pattern.compile(pattern), input, fn);
    }
 
    public static <T> Stream<T> match(Pattern pattern, CharSequence input, Function<? super Matcher, ? extends T> fn) {
        Supplier<Spliterator<T>> supplier = () -> {
            final Matcher matcher = pattern.matcher(input);
            return new Spliterator<T>() {
                @Override
                public boolean tryAdvance(Consumer<? super T> action) {
                    if (!matcher.find()) return false;
                    action.accept(fn.apply(matcher));
                    return true;
                }
 
                @Override
                public Spliterator<T> trySplit() {
                    return null;
                }
 
                @Override
                public long estimateSize() {
                    return Long.MAX_VALUE;
                }
 
                @Override
                public int characteristics() {
                    return ORDERED | IMMUTABLE;
                }
            };
        };
        return StreamSupport.stream(supplier, Spliterator.ORDERED | Spliterator.IMMUTABLE, false);
    }
}
 

Comments

  •  icon
    01/01/70 12:00:00 AM UTC
    Plain Text |

    0 B

    |

    👍

    /

    👎