Я не могу найти хороший способ создать Stream
с нуля. Предположим, например (примечание, приведенный ниже код является лишь примером для обсуждения), что у меня естьСоздание потока с нуля или из итератора
Matcher m = Pattern.compile(re).matcher(input);
List<String> matches = new ArrayList<>();
while (m.find())
matches.add(m.group());
и хотите использовать потоковый API. Я хотел бы сделать, как коснуться
List<String> matches = Stream.of(() -> m.find(),() -> m.group())
.collect(Collectors.toList());
Где () -> m.find()
является функцией, говоря, если есть больше элементов, и () -> m.group()
является функцией, чтобы обеспечить следующий элемент.
Это легко создать Iterator
например:
class MatchIterator implements Iterator<String> {
Matcher m;
boolean hasNext;
public MatchIterator(Matcher m) {
this.m = m;
hasNext = m.find();
}
@Override
public boolean hasNext() {
return hasNext;
}
@Override
public String next() {
String next = m.group();
hasNext = m.find();
return next;
}
}
Но я не могу понять, простой способ создания потока из итератора либо.
Изменить: Я понимаю, что я могу создать Iterable
что создает MatchIterator
с (а затем использовать StreamSupport
/Spliterator
), но это требует от меня, чтобы быть в состоянии перебрать источник несколько раз, так что это еще не является универсальным решением ,
Спасибо Брайан. Класс 'Spliterators' и' spliteratorUnknownSize' были чем-то вроде недостающей части моей головоломки. Тот факт, что 'tryAdvance' должен вызывать следующее значение для потребителя, также был немного запутанным при использовании для реализации старых старых итераторов. Но я согласен, возможно, проще реализовать «Spliterator», когда-то привыкший к этому. – aioobe