给出这样一个对象:
Matcher matcher = pattern.matcher(sql);
使用方式如下:
Set<String> matches = new HashSet<>();
while (matcher.find()) {
matches.add(matcher.group());
}
我想用更像面向对象的东西替换这个while循环:
new Iterator<String>() {
@Override
public boolean hasNext() {
return matcher.find();
}
@Override
public String next() {
return matcher.group();
}
}
这样我就可以轻松地制作匹配流,坚持使用流畅的API等。
问题是,我不知道也找不到更简洁的方法来创建这个Stream或Iterator。像上面这样的匿名课程对我来说太冗长了。
我曾希望在jdk中找到类似IteratorFactory.from(matcher::find, matcher::group)
或StreamSupport.of(matcher::find, matcher::group)
的内容,但到目前为止还没有运气。我毫不怀疑像apache commons或guava这样的库为此提供了一些东西,但是让我说我不能使用它们。
Streams或Iterators是否有方便的工厂在jdk中使用hasNext / next方法组合?
答案 0 :(得分:1)
在java-9中,您可以通过以下方式完成:
\s\s*
在java-8中,你需要一个后端口,取自Holger's fabulous answer
修改强>
有一种方法btw ;
可以合并Set<String> result = matcher.results()
.map(MatchResult::group)
.collect(Collectors.toSet());
System.out.println(result);
,如下所示:
tryAdvance
用法例如:
find/group
答案 1 :(得分:1)
我写的这门课程体现了我想在jdk中找到的东西。显然虽然它不存在。 eugene's accepted answer提供了一个java 9 Stream解决方案。
public static class SearchingIterator<T> implements Iterator<T> {
private final BooleanSupplier advancer;
private final Supplier<T> getter;
private Optional<T> next;
public SearchingIterator(BooleanSupplier advancer, Supplier<T> getter) {
this.advancer = advancer;
this.getter = getter;
search();
}
private void search() {
boolean hasNext = advancer.getAsBoolean();
next = hasNext ? Optional.of(getter.get()) : Optional.empty();
}
@Override
public boolean hasNext() {
return next.isPresent();
}
@Override
public T next() {
T current = next.orElseThrow(IllegalStateException::new);
search();
return current;
}
}
用法:
Matcher matcher = Pattern.compile("\\d").matcher("123");
Iterator<String> it = new SearchingIterator<>(matcher::find, matcher::group);