如何在Java中從給定的地圖值中查找最新日期




date lambda (4)

我有下面的值與哈希值映射,在值中我已經日期為字符串數據類型。 我想比較地圖中所有可用的日期,並僅提取一個具有最近日期的鍵值。

我想與值而不是鍵進行比較。

我已包含以下代碼

import java.util.HashMap;
import java.util.Map;

public class Test {

  public static void main(String[] args) {

      Map<String, String> map = new HashMap<>();
      map.put("1", "1999-01-01");
      map.put("2", "2013-10-11");
      map.put("3", "2011-02-20");
      map.put("4", "2014-09-09");

      map.forEach((k, v) -> System.out.println("Key : " + k + " Value : " + v));
    }

}

預期的輸出是:

關鍵4值2014-09-09


乍一看,使用String文字來表示Date並不是一種好方法,並且使其更加脆弱且易於出錯。 您寧願首先使用 LocalDate 。 但是,假設您對該數據格式沒有任何控制權(例如,它來自另一個第三方系統),我們仍然可以設計一種解決當前問題的方法。 這是它的外觀。

Entry<String, String> maxEntry = map.entrySet().stream()
    .max(Comparator.comparing(e -> LocalDate.parse(e.getValue())))
    .orElseThrow(IllegalArgumentException::new);

LocalDate.parse 用於將日期的字符串表示形式轉換為可比較的 LocalDate 。 然後將該 Comparable 像作為鍵傳遞給 Comparator 構造方法。 這是成功執行後的輸出鍵值對:

4=2014-09-09

如果您只需要取消上述建議的日期的String表示形式,則可以使上述解決方案更加簡單明了。

Entry<String, LocalDate> maxEntry = map.entrySet().stream()
    .max(Map.Entry.comparingByValue())
    .orElseThrow(IllegalArgumentException::new);

Collections.max entrySet 使用

Entry<String, String> max = Collections.max(map.entrySet(), Map.Entry.comparingByValue());

要么

Entry<String, String> max = Collections.max(map.entrySet(),
    new Comparator<Entry<String, String>>() {
        @Override
        public int compare(Entry<String, String> e1, Entry<String, String> e2) {
            return LocalDate.parse(e1.getValue()).compareTo(LocalDate.parse(e2.getValue()));
        }
});

您可以將字符串解析為 LocalDate 並以相反的順序對其進行排序

 Entry<String, String> res = map.entrySet()
                                .stream()
                                .sorted(Comparator.comparing((Entry<String, String> entry)->LocalDate.parse(entry.getValue())).reversed())
                                .findFirst()
                                .orElse(null);  // if not present return null or empty Entry

與其他日期相比,這應該提供最新(也稱為最大)日期。

      String max = map.values().stream().reduce("0000-00-00",
            (a, b) -> b.compareTo(a) >= 0 ? b
                  : a);

如果您還需要密鑰,請執行此操作並返回Map.Entry。 需要Java 9+

         Entry<String, String> ent =
            map.entrySet().stream().reduce(Map.entry("0", "0000-00-00"),
                  (a, b) -> b.getValue().compareTo(a.getValue()) >= 0 ? b
                        : a);

         System.out.println(ent.getKey() + " -> " ent.getValue());

假設您的地圖是非空的。 如果為空,則返回null。 適用於Java 8+

        Entry<String, String> ent = map.entrySet().stream().reduce(
            (a, b) -> b.getValue().compareTo(a.getValue()) >= 0 ? b
                  : a).orElseGet(() -> null);




java-stream