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
0 B
|👍
/👎