Это просто, чтобы поделиться тем, как я решил решить эту маленькую головоломку. Я перепроектировал библиотеку, чтобы не брать Pattern
, а принимать предикат, например:
public static Set<String> findAll() {
return find(input -> true);
}
public static Set<String> findSubstring(String s) {
return find(input -> input.contains(s));
}
public static Set<String> findPattern(Pattern p) {
return find(p.asPredicate());
}
public static Set<String> findCaseInsensitiveSubstring(String s) {
return find(Pattern.compile(Pattern.quote(s), Pattern.CASE_INSENSITIVE).asPredicate());
}
private static Set<String> find(Predicate<String> matcher) {
var testInput = Set.of("some", "text", "to", "test");
return testInput.stream().filter(matcher).collect(Collectors.toSet());
}
public static void main(String[] args) {
System.out.println(findAll());
System.out.println(findSubstring("t"));
System.out.println(findPattern(Pattern.compile("^[^s]")));
System.out.println(findCaseInsensitiveSubstring("T"));
}
, где я использовал все комментарии и ответы, приведенные до сих пор.
Обратите внимание, что есть также Pattern#asMatchPredicate()
в случае, если вместо этого требуется сопоставление, например, для функции matchPattern
.
Конечно, выше это просто демонстрация, а не фактические функции в моем решении.