如何从Java中的分隔符返回下一个元素

jør*_* s. 5 java iterator consumer java-8 spliterator

我想从拆分器中获取下一个元素,而不仅仅是对下一个元素“执行操作”。例如,通过实现以下方法

<T> T getnext(Spliterator<T> s) {

}
Run Code Online (Sandbox Code Playgroud)

我发现的所有搜索结果都说tryAdvance()就像是迭代器hasNext()和next()的组合,除了那是一个大谎言,因为我无法获取下一个元素,只是“对下一个元素执行操作”。

cod*_*dev 4

您可以将项目包装在列表中,然后从该列表返回:

    public static <T> T getNext(Spliterator<T> spliterator) {
        List<T> result = new ArrayList<>(1);

        if (spliterator.tryAdvance(result::add)) {
            return result.get(0);
        } else {
            return null;
        }
    }
Run Code Online (Sandbox Code Playgroud)

为了让调用者更清楚地知道这是一个可能返回 null 的操作,请考虑返回Optional

    public static <T> Optional<T> getNext(Spliterator<T> spliterator) {
        final List<T> result = new ArrayList<>(1);

        if (spliterator.tryAdvance(result::add)) {
            return Optional.of(result.get(0));
        } else {
            return Optional.empty();
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 如果你想返回一个`Optional`,[这个答案](/sf/answers/4047462681/)更简单。您的第一个变体可以简化为“return spliterator.tryAdvance(result::add)?” result.get(0): null;` 或者使用 `Deque&lt;T&gt; d = new ArrayDeque&lt;&gt;(1); spliterator.tryAdvance(d::push); 而是返回 d.poll();`。 (2认同)