如何使用 Java 8 / Streams 在 HashMap 中找到具有某些条件的最大键?

vij*_*ayk 3 java performance java-8 java-stream

假设我有以下数据:

在此处输入图片说明

题 :

  1. 我想找到最大 orderId 的 zscore,其中 Pair 为“AB”,OrderType 为“Buy”,状态为“InProgress”。

注意:我将此数据存储到 HashMap 中,名称为 orderBook,其中键为 orderId,值为 OrderModel(PairName、OrderType、Status、zscore)。

解决方案1:

    int maxOrderId = 0 ;
        getOrderBook().entrySet().stream()
                                .filter(e -> e.getValue().getPairName().equals("AB")
                                        && e.getValue().getCompletedStatus().equals("InProgress")
                                        && e.getValue().getOrderType().equals("Buy"))
                                .forEach(o -> {
                                    if (maxOrderId < o.getKey()) {
                                        maxOrderId = o.getKey();
                                    }
                                });
        
        double zscore = getOrderBook().get(maxOrderId).getzScore();
       System.out.println("Order ID :"+ maxOrderId +", Zscore :"+zscore);
Run Code Online (Sandbox Code Playgroud)

输出 : Order ID : 5, Zscore : -2.5

我可以使用上面的代码找到 zscore,但我想一次性找到。

那么如何在一行中使用 Java 8 / 流找到最大 OrderId 的 zscore?

有没有比我的代码更好的方法?

Jer*_*eke 5

你要找的是max方法:

Optional<Entry<Long,Order>> maxIdEntry = getOrderBook()
  .entrySet()
  .stream()
  .filter(/* your filter logic */)
  .max(Comparator.comparing(Entry::getKey));
Run Code Online (Sandbox Code Playgroud)

这会产生一个 Optional,所以要么使用isPresent()andget()方法,要么使用ifPresent(Consumer<T> consumer)方法来处理结果