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

如何将动态集合作为流处理?

杜成和
2023-03-14

Java8集合提供了以流形式获取集合的特性。然而,一旦我们调用stream()方法,我们就会以stream的形式获得集合的当前内容。如果我的集合在流处理过程中增长怎么办?流上的操作可能会用更多的数据更新集合。有没有一个简单有效的方法来处理这种情况?

Queue<Url> concurrentUrlQue= initUrlQueue();
concurrentUrlQue.stream().forEach((url)->readAndExtractUrls(url, concurrentUrlQue));

共有1个答案

太叔马鲁
2023-03-14

您需要编写在等待新元素时阻塞的拆分器。

class QueueSpliterator<T> extends Spliterators.AbstractSpliterator<T> {

  private final BlockingQueue<T> queue;

  public QueueSpliterator(BlockingQueue<T> queue) {
    super(Long.MAX_VALUE, 0);
    this.queue = queue;
  }

  public boolean tryAdvance(Consumer<? super T> action) {
    try {
      T element = queue.take();
      action.accept(element);
      return true;
    } catch (InterruptedException e) {
      return false;
    }
  }
}

然后使用该拆分器创建一个流,并像处理普通无限流一样处理它。

public class Main {
  public static void main(String... args) {
    BlockingQueue<Integer> queue = new ArrayBlockingQueue<>(1000);

    new Thread(() -> {
      for (int i = 0; i < 1000; ++i) {
        try {
          queue.put(i);
        } catch (InterruptedException e) {
          throw new RuntimeException(e);
        }
      }
    }).start();


    Spliterator<Integer> queueSpliterator = new QueueSpliterator<>(queue);
    Stream<Integer> stream = StreamSupport.stream(queueSpliterator, false);

    stream.forEach(System.out::println);
  }
}
 类似资料:
  • 我刚刚补充道 对这个项目。我有<code>suspend fun foo():Flow 我需要获得

  • 我是RabbitMQ新手,我使用教程尝试了RabbitMQ示例https://www.rabbitmq.com/getstarted.html. 有人能解释一下如何按设置发布消息,而不是一次发布一条消息吗?此外,如何订阅消息从队列作为一个集合,而不是单一的消息一次。 也就是说,我们如何在RabbitMQ中实现发布和使用队列消息作为作业集? 提前谢谢。

  • 我正在讨论设计我们的API(Stream vs Collection作为返回类型)的最佳方式。这篇文章中的讨论非常有价值。 @BrainGotez的答案提到了一个条件,即集合优于流。我不太明白这意味着什么,谁能帮我举个解释的例子? 当有很强的一致性要求时,您必须生成移动目标的一致快照 我的问题是,具体而言,“强一致性要求”和“移动目标的一致快照”在现实应用中意味着什么?

  • 问题内容: 我有以下架构,其中项目类型可能有所不同,并在中提到。 我正在尝试进行动态查找,以便填充item对象。但这似乎不起作用。 我知道我可以使用,但想知道是否可以使用$ lookup 问题答案: 到目前为止,您还不能。该字段不能是表达式,而必须是字符串文字。但是,您可以在这里跟踪一个未解决的问题,该问题似乎恰恰是您所需要的:https : //jira.mongodb.org/browse/S

  • Set似乎是一种创建具有保证唯一元素的数组的好方法,但它不提供任何获取属性的好方法,除了generator[Set].values,它以的尴尬方式调用。 如果您可以在集合上调用和类似的函数,那么这是可以的。但你也不能那样做。 我尝试过,但似乎只转换了类数组(NodeList和TypedArrays?)对象设置为数组。再试一次:对Sets不起作用,set.prototype没有类似的静态方法。 那么