我找不到从头开始创建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
),但这需要我能够多次遍历源代码,因此它仍然不是通用的解。 最佳答案
要制作Stream
,您需要一个Spliterator
。然后,用Stream
创建一个StreamSupport.stream()
。 (这就是所有集合所做的。)
如果您已经有一个Iterable
,则可以从其Spliterator
方法中获得一个spliterator()
(尽管您可能想编写一个更好的方法;默认值为弱)。
如果有Iterator
,则可以使用Spliterator
将其转换为Spliterators.spliteratorUnknownSize(Iterator)
。 (同样,这会为您提供分离器,但不一定是最佳分离器。)
如果两者都不存在,则可以编写Spliterator
;它通常比编写Iterator
更容易(要实现的方法更多,但通常更简单,因为您不必在next
和hasNext
之间重复逻辑。)
关于java - 从头开始或从迭代器创建流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26255940/