想让逻辑Java8兼容更高效

Want to make the logic Java8 Compatible and More Efficient

我写了一个 Logic,它对 Hashmap 和 returns String 进行一些计算。 我想通过使用 Java8 功能和 Apache Commons 功能以更有效的方式编写它。 逻辑没有任何问题,但不够清晰和可读。

public String giveMeTheRightOrder(CustomObject customObject) {

String  order = null;

  Map<ArticleType , ArticleStatus > objMap = customObject.getArticles();
 boolean isArticleClothing = false;
 boolean isArticleFoodItem = false;

  if(objMap != null && objMap.size() == 2) {
          for(ArticleType articleType : objMap.keySet()) {

             if(articleType.toString().equalsIgnoreCase(ArticleType.CLOTH.toString())) {
                       isArticleClothing  = true;
        }
               if(articleType.toString().equalsIgnoreCase(ArticleType.FOOD.toString())) {
                       isArticleFoodItem = true;
        }

    }
           if(isArticleClothing  && isArticleFoodItem ){
                 int liveCount = 0;
              for(ArticleStatus articleStatus : objMap.values() ) {
                 if(articleStatus.toString().equalsIgnoreCase(ArticleStatus.LIVE.toString() )) {
                       liveCount++;
            }
        }
        if(liveCount  != 2 )
            {
                           for(Map.Entry<ArticleType , ArticleStatus> entry : objMap.entrySet()) {
                if(entry.getValue().toString().equalsIgnoreCase(ArticleStatus.LIVE.toString()) {
                    
                    order  = entry.getKey().toString();
                                         break;
                }
            }
        } else {
                         order = ArticleType.CLOTH.tostring();
        }
            } else {
                     order = "COMPLETE";
        }
    }

        for(Map.Entry<ArticleType, ArticleStatus> entry : objMap.entrySet() ) {
                  if(entry.getValue().toString().equalsIgnoreCase(ArticleStatus.LIVE.toString())){
                         order = entry.getKey().toString();
                         break;
        }
            else{
                   order = "COMPLETE";
        }

    }
     return order;
} 

根据您的代码:

如果地图有两个键(ArticleType.CLOTHArticleType.FOOD),那么您计算地图中的 LIVE 值。然后如果 countLive 数量不是 2,你已经遍历地图并找到第一个键,它的值为 LIVE 另一方面你设置了 CLOTH 我认为它不需要。

如果地图大小为 2,您可以这样做:如果两个键都是 LIVE,则 return ArticleType.CLOTH

if (objMap != null && objMap.size() == 2) {
   if (ArticleStatus.LIVE.equals(objMap.get(ArticleType.CLOTH)) && 
        ArticleStatus.LIVE.equals(objMap.get(ArticleType.FOOD))) {
      return ArticleType.CLOTH.toString();
   }
}

对于其他情况,您可以这样做:

return objMap.entrySet().stream()
            .filter(entry -> entry.getValue().toString()
                    .equalsIgnoreCase(ArticleStatus.LIVE.toString()))
            .findFirst().map(entry -> entry.getKey().toString()).orElse("COMPLETE");

完整代码如下:

  public String giveMeTheRightOrder(CustomObject customObject) {
    Map<ArticleType, ArticleStatus> objMap = customObject.getArticles();
    if(objMap == null) return "COMPLETE";
    if (objMap.size() == 2) {
        if (ArticleStatus.LIVE.equals(objMap.get(ArticleType.CLOTH)) &&
             ArticleStatus.LIVE.equals(objMap.get(ArticleType.FOOD))) {
          return ArticleType.CLOTH.toString();
        }
    }
    return objMap.entrySet().stream()
            .filter(entry -> entry.getValue().toString()
                     .equalsIgnoreCase(ArticleStatus.LIVE.toString()))
            .findFirst()
            .map(entry -> entry.getKey().toString()).orElse("COMPLETE");
}