【问题标题】:How to get the first key value from map using JAVA 8?如何使用 JAVA 8 从地图中获取第一个键值?
【发布时间】:2017-09-23 10:29:32
【问题描述】:

至于现在我在做什么:

Map<Item, Boolean> processedItem = processedItemMap.get(i);

        Map.Entry<Item, Boolean> entrySet = getNextPosition(processedItem);

        Item key = entrySet.getKey();
        Boolean value = entrySet.getValue();


 public static Map.Entry<Item, Boolean> getNextPosition(Map<Item, Boolean> processedItem) {
        return processedItem.entrySet().iterator().next();
    }

有没有更简洁的方法可以用 java8 做到这一点?

【问题讨论】:

    标签: java java-8 iterator java-stream


    【解决方案1】:

    看来你需要findFirst这里

       Optional<Map.Entry<Item, Boolean>> firstEntry =    
            processedItem.entrySet().stream().findFirst();
    

    显然 HashMap 没有顺序,因此 findFirst 可能会在不同的调用中返回不同的结果。对于您的情况,可能更合适的方法是findAny

    【讨论】:

      【解决方案2】:

      我发现你的方法有两个问题:

      • 如果地图为空,会抛出异常
      • 例如,HashMap 没有顺序 - 所以你的方法实际上更像是 getAny() 而不是 getNext()

      对于流,您可以使用以下任一方式:

      //if order is important, e.g. with a TreeMap/LinkedHashMap
      map.entrySet().stream().findFirst();
      
      //if order is not important or with unordered maps (HashMap...)
      map.entrySet().stream().findAny();
      

      返回一个Optional

      【讨论】:

      • 是的,我将更改为 TreeMap。你能告诉我如何从 Optional 获取条目吗
      • 我可以只使用 .get() 吗?
      • @user3407267 if (opt.isPresent()) Entry e = opt.get(); else doSomethingElse();,例如。根据您的需要/想要,还有其他方法。
      • 是的,如果您 100% 确定可选项不为空(即您知道地图不为空或您已使用 isPresent 进行测试),则可以使用 get。
      • 如果你无论如何都要做if(opt.isPresent()) { Entry e = opt.get(); } else doSomethingElse();,与if(!map.isEmpty()) { Entry e = map.entrySet().iterator().next(); } else doSomethingElse();没有显着差异
      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-16
      • 1970-01-01
      • 2021-09-19
      相关资源
      最近更新 更多