当前位置: 首页 > 面试题库 >

如何从迭代器创建Java 8 Stream?

羿易安
2023-03-14
问题内容

是否可以从迭代器创建一个Stream,其中对象的序列与通过重复调用迭代器的next()方法生成的对象的序列相同?我正在考虑的特定情况涉及TreeSet.descendingIterator()返回的迭代器的使用,但是我可以想象在其他情况下可以使用迭代器而不是它引用的集合。

例如,对于a,TreeSet<T> tset我们可以tset.stream()...按照集合的排序顺序来编写并获取该集合中的对象流,但是如果我们希望它们以不同的顺序(例如,使用using可以得到)descendingIterator()呢?我正在想象类似tset.descendingIterator().stream()...或的东西stream( tset.descendingIterator() )...,尽管这些形式都不有效。


问题答案:

对于的特定示例NavigableSet.descendingIterator(),我认为最简单的方法是使用NavigableSet.descendingSet()

但是鉴于您可能对更一般的情况感兴趣,因此以下方法似乎可行:

import java.util.Iterator;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.TreeSet;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;

public class Streams {
    public static void main(String... args) {
        TreeSet<String> set = new TreeSet<>();
        set.add("C");
        set.add("A");
        set.add("B");

        Iterator<String> iterator = set.descendingIterator();

        int characteristics = Spliterator.DISTINCT | Spliterator.SORTED | Spliterator.ORDERED;
        Spliterator<String> spliterator = Spliterators.spliteratorUnknownSize(iterator, characteristics);

        boolean parallel = false;
        Stream<String> stream = StreamSupport.stream(spliterator, parallel);

        stream.forEach(System.out::println); // prints C, then B, then A
    }
}

简而言之,您必须使用中的一种静态方法SpliteratorIterator第一个创建一个Spliterators。然后,您可以Stream使用中的静态方法创建一个StreamSupport

我还没有太多关于手工创建Splitters和Streams的经验,因此我无法真正评论特性应该是什么或它们将产生什么效果。在这个特定的简单示例中,我是否定义了上述特征,或者是否将其设置为0(即没有特征)似乎都没有关系。还有一种Spliterators用于创建具有初始大小估计值的Spliterator
的方法-
我想在这个特定示例中可以使用set.size(),但是如果您想处理任意Iterators,我想情况就不会如此。同样,我不太确定它会对性能产生什么影响。



 类似资料:
  • 是否可以从迭代器创建一个流,其中对象的序列与通过反复调用迭代器的next()方法生成的序列相同?我所考虑的具体情况涉及到Treeset.desceningIterator()返回的迭代器的使用,但是我可以想象在其他情况下,迭代器是可用的,而不是它所引用的集合。 例如,对于,我们可以编写并按照该集合的排序顺序获取该集合中的对象流,但是如果我们希望它们按照不同的顺序,比如通过使用获得的顺序呢?我想象的

  • 看看我制作的以下类: 以及它在以下方面的用法: 如果我使用,可能令人惊讶的是,我将永远得不到无限流。 相反,代码将在底层方法中创建时永远循环。 到目前为止,这是纯理论上的,但如果我想首先跳过无限流中的前x个数字,然后用最后的y个数字来限制它,我可以明确地理解它的必要性,如下所示: 代码不会返回一个结果,应该怎么做呢?

  • 我天真地试图这样做: 要创建迭代器,我可以使用闭包轻松地发送到任务。 但是,它会产生可怕的寿命不匹配错误: 我不明白这个错误。 闭包应采用生命周期为“a”的参数,即结构的生命周期。 国家为结构所有,因此其生命周期为“a”。 使用下一步。召唤(( 所以这里的不匹配是下一个()中的自我终生和“呼叫中的a”之间的不匹配...但我不明白为什么它不是“a”。 修复上述代码的正确方法是什么? 有没有更好的方法

  • 我有一个自定义模板类- 我想要一个常量迭代器开始于myClass,常量迭代器结束于myClass,它能够迭代myClass矩阵中的对象T,我正在努力创建这样的东西。 在我看来,我想把矩阵上的所有对象T聚集到某个局部一维向量,然后返回迭代器。从这个向量或迭代器开始。结束这个向量 此外,我希望能够支持for-each循环如下: 谢谢!

  • 所以我有一个包含一些请求和响应数据的json文件,我想要完成的是遍历这些数据并创建一个使用每个请求和响应的pact文件。 所以目前我正在使用junit中的参数化测试来迭代我们的json数据,这基本上是有效的,只是因为生产者名称对于所有pacts都是相同的,它创建了相同的文件并覆盖了前面的文件。 不确定是否有更好的方法来实现这一点,我查看了Github for Pact Jvm并查看了堆栈溢出,但未

  • 我需要为应用程序中的不同对象实例创建单独的日志。例如,如果我们处理书籍,我需要为每本书创建单独的日志文件。它可以与log4j2配合使用。xml文件,但我的内存中可能有数百个这样的对象,我不想创建这么长的配置文件。我想从代码中创建appender和logger。我查找了工作代码示例,但什么也没找到。 我尝试使用RollingFileAppender。createAppender,但未找到如何将其附加