Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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);
- }
- }
Add Comment
Please, Sign In to add comment