import java.util.function.Consumer; 
import java.util.function.Predicate; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class JI9059044 {

	public static void main(String[] args) {
		checkHitEnd("normal", JI9059044::checkHitEndNormal); 
		checkHitEnd("incomplete surrogate pair", JI9059044::checkHitEndIncompleteSurrogatePair); 
	} 

	private static void checkHitEnd(String checkName, Predicate<Consumer<Matcher>> checkMethod) { 
		System.out.println("hitEnd(): " + checkName); 
		System.out.println(" matches: " + checkMethod.test(Matcher::matches)); 
		System.out.println(" lookingAt: " + checkMethod.test(Matcher::lookingAt)); 
		System.out.println(" find: " + checkMethod.test(Matcher::find)); 
	} 

	private static boolean checkHitEndNormal(Consumer<Matcher> matcherAction) { 
		final String input = "abc"; 
		final Pattern pattern = Pattern.compile("abcd"); 
		final Matcher matcher = pattern.matcher(input); 
		matcherAction.accept(matcher); 
		return matcher.hitEnd(); 
	} 

	private static boolean checkHitEndIncompleteSurrogatePair(Consumer<Matcher> matcherAction) { 
		final String hexString = "1F30C"; 
		final char[] chars = Character.toChars(Integer.parseInt(hexString, 16)); 
		final Pattern pattern = Pattern.compile("\\x{" + hexString + "}"); 
		final Matcher matcher = pattern.matcher(String.valueOf(chars[0])); 
		matcherAction.accept(matcher); 
		return matcher.hitEnd(); 
	} 

}
