假设我有以下数据:
java - 如何使用Java 8/Streams在HashMap中找到某些条件下的最大 key ?-LMLPHP
题 :

  • 我想找到最大orderId的zscore,其中Pair为'AB',OrderType为'Buy',状态为'InProgress'。

  • 注意:我将此数据存储到HashMap中,名称为orderBook,其中Key为orderId,Value为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);
    
    输出:Order ID : 5, Zscore : -2.5我可以使用上面的代码找到zscore,但是我想一次找到。
    那么,如何在一行中使用Java 8 /流找到最大OrderId的zscore?
    有什么比我的代码更好的方法吗?

    最佳答案

    您可以使用max()Comparator来映射最大的OrderId,并使用mapOptional映射zScore

    double zscore = getOrderBook()
              .entrySet()
              .stream()
              .filter(e -> e.getValue().getPairName().equals("AB")
                          && e.getValue().getCompletedStatus().equals("InProgress")
                          && e.getValue().getOrderType().equals("Buy"))
              .max(Comparator.comparing(Entry::getKey))
              .map(e -> e.getValue().getzScore())
              .orElse(0);
    

    10-08 02:51