当前位置: 首页 > 知识库问答 >
问题:

流化迭代器的最简单方法

张鹏云
2023-03-14

假设您希望对迭代器的元素进行流式处理;让我们使用一个扫描器的具体示例,它实现了迭代器

给定迭代器,比方说:

// Scanner implements Iterator<String>
Iterator<String> scanner = new Scanner(System.in);
StreamSupport.stream(
  Spliterators.spliteratorUnknownSize(scanner, Spliterator.ORDERED), false);
 StreamSupport.stream(
  ((Iterable<String>) () -> new Scanner(System.in)).spliterator(), false);

在给定迭代器 的情况下,JDK中是否有一个工厂方法返回

共有1个答案

咸利
2023-03-14

我只需要使用stream.generate(iterator::next)。是的,它是一个无限流,但是system.in中的扫描器也是如此,除非您知道您需要多少行,在这种情况下,它很容易使用

Stream.generate(iterator::next).limit(numLines);

这可以防止迭代器被迭代两次(一次作为迭代器,一次作为流)。

如果您需要一个有大小的流而不知道它会有多大,但又不想弄乱您的代码,只需创建一个显式地接受可迭代 的实用程序方法:

public static <T> Stream<T> stream(Iterable<T> it){
    return StreamSupport.stream(it.spliterator(), false);
}  

它最终会比试图将其全部塞在一行中更易读,然后您就可以调用Stream(()->Iterator);Stream(()->New Scanner(system.in));

您也可以很容易地添加第二个方便方法:

public static <T> Stream<T> stream(Iterator<T> it){
    return stream(()->it);
}

使您能够调用流(迭代器);流(新扫描程序(System.in));

但是,如果我要将system.in读取到流中,我可能会使用读取器而不是扫描器:

return new BufferedReader(new InputStreamReader(System.in)).lines();
 类似资料:
  • 问题内容: 我在PyQt中有一个带有功能的GUI 。容易想象,当新图像应添加到QListWidget中时被调用。为了检测文件夹中的新图像,我使用了with来检测文件夹中的文件更改,然后该线程直接调用。 出于线程安全的原因,这会产生不应在gui线程之外调用的警告。 使此线程安全的最佳和最简单的方法是什么?QThread?信号/插槽?QMetaObject.invokeMethod?我只需要从线程传递

  • 问题内容: 我在这个小提琴中玩弄指令和绑定。我收到以下错误: 为什么会这样呢?我认为这与绑定有关。 问题答案: 这是因为它在每次经历摘要周期时都在创建一个全新的对象。监视在此数据绑定中注册,因此每次它评估一个新对象时都会创建它,因此它将与以前的值不同,从而触发另一个摘要循环。最终,它终止,因此不会无限循环。有关更详尽的说明,请参见http://docs.angularjs.org/guide/co

  • 我有一个顺序数据源,表示为简单迭代器(或流)。数据相当大,不适合内存。此外,源代码可以遍历一次,并且获取成本很高。该源用于一些重过程(黑盒),该过程将迭代器(或流)作为其参数来使用线性数据。好的,很简单。但如果我有两种不同的消费程序,我该怎么办??正如我所说的,我不想将输入数据吸入类似列表的集合中。我也可以从一开始就重读源代码两次来完成我的任务,但我不喜欢这样,因为这样做没有效果。如果事实上我需要

  • 我一直在玩Java新的和闪亮的功能部分,最让我困惑的事情之一是流? 它们有什么用? 在谷歌上,我主要找到了如何使用它们的解释和实际例子,我已经记下来了,没有关于幕后魔法的具体内容,这是我感兴趣的。 我的意思并不是说,从实际意义上讲,我从一些函数语言中找到了map/filter/reduce/etc。相当快,但为什么我们需要先转换为流?Java已经有了迭代器。流和迭代器之间是否有根本的区别,比如一个

  • 问题内容: 我正在尝试使用JSON(使用simplejson)序列化python对象列表,并收到以下错误:对象“不可JSON序列化”。 该类是一个简单的类,其字段只有整数,字符串和浮点数,并且从一个父超类继承相似的字段,例如: foo,bar是我上面提到的简单类型。唯一棘手的事情是,ChildClass有时具有一个字段,该字段引用另一个对象(类型不是ParentClass或ChildClass)。

  • 问题内容: ?将转换为并对其进行迭代?还有吗 问题答案: 我使用for循环来迭代字符串,并使用它来获取每个字符以进行检查。由于是通过数组实现的,因此该方法是恒定时间操作。 那就是我会做的。在我看来,这是最简单的。 就正确性而言,我认为这不存在。这完全取决于你的个人风格。