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

终止或中断java 8流循环[重复]

邬令
2023-03-14

我有一个包含以下内容的Java8流循环

    void matchSellOrder(Market market, Order sellOrder) {
        System.out.println("selling " + market.pair() + " : " + sellOrder);

        market.buyOrders()
                .stream()
                .filter(buyOrder -> buyOrder.price >= sellOrder.price)
                .sorted(BY_ASCENDING_PRICE)
                .forEach((buyOrder) -> {
                    double tradeVolume = Math.min(buyOrder.quantity, sellOrder.quantity);
                    double price = buyOrder.price;

                    buyOrder.quantity -= tradeVolume;
                    sellOrder.quantity -= tradeVolume;

                    Trade trade = new Trade.Builder(market, price, tradeVolume, Trade.Type.SELL).build();
                    CommonUtil.convertToJSON(trade);

                    if (sellOrder.quantity == 0) {
                        System.out.println("order fulfilled");
                        // break loop there
                    }
                });
    }
        List<Order> applicableSortedBuyOrders = market.buyOrders()
                .stream()
                .filter(buyOrder -> buyOrder.price >= sellOrder.price)
                .sorted(BY_ASCENDING_PRICE)
                .collect(toList());

        for(Order buyOrder : applicableSortedBuyOrders){
            double tradeVolume = Math.min(buyOrder.quantity, sellOrder.quantity);
            double price = buyOrder.price;

            buyOrder.quantity -= tradeVolume;
            sellOrder.quantity -= tradeVolume;

            Trade trade = new Trade.Builder(market, price, tradeVolume, Trade.Type.SELL).build();
            CommonUtil.printAsJSON(trade);

            if (sellOrder.quantity == 0) {
                System.out.println("order fulfilled");
                break;
            }
        }

共有1个答案

邬楚青
2023-03-14

stream.foreach不是一个循环,也不是为了使用break之类的东西终止它而设计的。如果流是一个并行流,那么lambda主体可以同时在不同的线程上执行(不容易中断,而且很容易产生错误的结果)。

最好使用带有while循环的迭代器:

Iterator<BuyOrderType> iter = market.buyOrders() // replace BuyOrderType with correct type here
            .stream()
            .filter(buyOrder -> buyOrder.price >= sellOrder.price)
            .sorted(BY_ASCENDING_PRICE).iterator();
while (iter.hasNext()) {
    BuyOrderType buyOrder = iter.next()  // replace BuyOrderType with correct type here
    double tradeVolume = Math.min(buyOrder.quantity, sellOrder.quantity);
    double price = buyOrder.price;

    buyOrder.quantity -= tradeVolume;
    sellOrder.quantity -= tradeVolume;

    Trade trade = new Trade.Builder(market, price, tradeVolume, Trade.Type.SELL).build();
    CommonUtil.convertToJSON(trade);

    if (sellOrder.quantity == 0) {
        System.out.println("order fulfilled");
        break;
    }
}
 类似资料:
  • 问题内容: 我有一个Java 8流循环,其内容如下: 满足某些条件时如何跳出循环?什么是关闭流的正确方法呢? 更新 我滥用流技术,假设它是一个循环,不是为此而设计的。这是我使用下面提供的答案最终得到的代码: 问题答案: 不是循环,也并非设计为使用终止。如果流是并行流,则lambda主体可以同时在不同的线程上执行(这不容易打破,并且很容易产生错误的结果)。 最好使用带有while循环的迭代器:

  • 运行这段代码,我希望它增加测试变量5秒,然后完成。 然而,当我运行它时,程序并没有结束(我假设,我已经给了它合理的时间)。然而,如果我将while循环改为 程序在预期的时间内完成(并打印出许多行)。我不明白。为什么会出现这种现象?

  • 我在尝试一个测试,我写了这个程序。。。 六羟甲基三聚氰胺六甲醚。。。在下面的代码中,我知道我用了“I”而不是“j”,所以为了解决这个问题,我用了这个 我在节目中遇到的问题是- 在上面的代码中,当我删除这个if块时- 这个节目无限期地进行。。。。。。。。。但当我再次放置这个if块时,程序在执行一段时间后自动终止。我也在这个链接上读到了这一点,但它展示了java的例子 它们显示了负值的原因,但在我的程

  • 作为练习,我将一些旧代码转换为函数流。我对溪流了解不多。看起来转换这段代码应该很简单,但我运气不太好。该方法从给定的整数开始,将其传递给isPrime,如果它是prime,isPrime将返回true。然后将要打印的新(下一个)素数交给用户。如果isPrime为false,则i递增,我们检查下一个整数。

  • 我的情况是,我用移位寄存器控制72个LED。可通过特定请求激活每个LED。很容易将LED设置为高,但LED应闪烁。通过“for”使LED闪烁不是问题。我设法使LED闪烁,一旦它闪烁,当新的请求进来时,它不会停止。LED应仅在新请求到达之前闪烁。 我的问题是,如果在闪烁的过程中(在示例中3次)我不能停止它。如果我正在发送一个新的

  • 编辑:修正了缺少的“)”,对不起,这不是问题。是的,我在模式中使用了一个不区分大小写的标志。下面是一些更多的代码: Edit2:stribizhev在下面指出的问题是,我在中读取的字符串实际上是整个ASCII文件。