features - java stream producer




Wie man das späteste Datum von dem gegebenen Kartenwert in Java findet (4)

Auf den ersten Blick ist die Verwendung von String-Literalen zur Darstellung von Datum kein guter Ansatz, da dies das System anfälliger und fehleranfälliger macht. Sie möchten LocalDate an erster Stelle verwenden. Unter der Annahme, dass Sie keine Kontrolle über dieses Datenformat haben (zum Beispiel, dass es von einem anderen System eines Drittanbieters stammt), können wir dennoch einen Ansatz entwickeln, der das vorliegende Problem löst. So sieht es aus.

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

Das LocalDate.parse wird verwandt, um die Zeichenfolge-Darstellung des Datums in einem LocalDate zu konvertieren, das ein LocalDate ist. Dieses Comparable wird dann als Schlüssel für die Comparator Konstruktionsmethode übergeben. Und hier ist das ausgegebene Schlüssel-Wert-Paar nach der erfolgreichen Ausführung:

4=2014-09-09

Wenn Sie lediglich auf die oben vorgeschlagene Darstellung des Datums als Zeichenfolge verzichten können, können Sie die obige Lösung viel einfacher und prägnanter gestalten.

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

Ich habe eine Hash-Map mit den folgenden Werten, in Werten, für die ich das Datum als String-Datentyp angegeben habe. Ich möchte alle Daten vergleichen, die in der Karte verfügbar sind, und nur einen Schlüsselwert extrahieren, der ein sehr aktuelles Datum hat.

Ich möchte mit Werten vergleichen, die keine Schlüssel sind.

Ich habe den folgenden Code eingefügt

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));
    }

}

Die erwartete Ausgabe für dieses ist:

Schlüssel 4 Wert 2014-09-09


Das sollte funktionieren

    Optional<Map.Entry<String, String>> result = map.entrySet().stream().max(Comparator.comparing(Map.Entry::getValue));
    System.out.println(result);

Ausgabe ist Optional[4=2014-09-09]


Sie können die Zeichenfolge in LocalDate und in umgekehrter Reihenfolge sortieren

 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

Sie können entweder:

import java.util.Map.Entry;

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

oder :

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

Beide führen zu demselben Ergebnis.





java-stream