我找不到从头开始创建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;
    }
}


但是我也想不出一种简单的方法来从迭代器创建流。



编辑:我知道我可以创建一个创建IterableMatchIterator(然后使用StreamSupport / Spliterator),但这需要我能够多次遍历源代码,因此它仍然不是通用的解。

最佳答案

要制作Stream,您需要一个Spliterator。然后,用Stream创建一个StreamSupport.stream()。 (这就是所有集合所做的。)

如果您已经有一个Iterable,则可以从其Spliterator方法中获得一个spliterator()(尽管您可能想编写一个更好的方法;默认值为弱)。

如果有Iterator,则可以使用Spliterator将其转换为Spliterators.spliteratorUnknownSize(Iterator)。 (同样,这会为您提供分离器,但不一定是最佳分离器。)

如果两者都不存在,则可以编写Spliterator;它通常比编写Iterator更容易(要实现的方法更多,但通常更简单,因为您不必在nexthasNext之间重复逻辑。)

关于java - 从头开始或从迭代器创建流,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26255940/

10-11 20:20