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 match = match(pattern, text, m -> "#" + m.group(1)); match.forEach(System.out::println); } public static Stream match(Pattern pattern, CharSequence input) { return match(pattern, input, m -> m.group(0)); } public static Stream match(String pattern, CharSequence input) { return match(Pattern.compile(pattern), input, m -> m.group(0)); } public static Stream match(String pattern, CharSequence input, Function fn) { return match(Pattern.compile(pattern), input, fn); } public static Stream match(Pattern pattern, CharSequence input, Function fn) { Supplier> supplier = () -> { final Matcher matcher = pattern.matcher(input); return new Spliterator() { @Override public boolean tryAdvance(Consumer action) { if (!matcher.find()) return false; action.accept(fn.apply(matcher)); return true; } @Override public Spliterator 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); } }