Ich habe eine Map<String,List<String>>
und möchte, dass daraus wird, Map<String,List<Long>>
weil jede String
in der Liste eine darstellt Long
:
Map<String,List<String>> input = ...;
Map<String,List<Long>> output=
input.entrySet()
.stream()
.collect(toMap(Entry::getKey, e -> e.getValue().stream()
.map(Long::valueOf)
.collect(toList()))
);
Mein Hauptproblem ist, dass jeder String
möglicherweise nicht richtig a darstellt Long
; Möglicherweise liegt ein Problem vor. Long::valueOf
kann Ausnahmen auslösen. In diesem Fall möchte ich eine Null oder ein Leerzeichen zurückgebenMap<String,List<Long>>
Weil ich danach über diese output
Karte iterieren möchte . Ich kann jedoch keine Fehlerkonvertierung akzeptieren. nicht einmal ein einziger. Haben Sie eine Idee, wie ich bei falscher Zeichenfolge -> lange Konvertierung eine leere Ausgabe zurückgeben kann?
java
java-8
java-stream
AntonBoarf
quelle
quelle
LongStream
wenn Sieempty
Ergebnisse entfernen möchten )Antworten:
Wie wäre es mit einem expliziten
catch
über die Ausnahme:quelle
nfe.getMessage()
input.entrySet().stream() .filter(e -> e.getValue().stream().anyMatch(s -> !new Scanner(s).hasNextLong())) .map(Map.Entry::getKey) .findAny()
Ich persönlich möchte einen
Optional
Beitrag zum Parsen von Zahlen liefern :Verwenden Sie dann Ihren eigenen Code (und ignorieren Sie schlechte Eingaben):
Ziehen Sie außerdem eine Hilfsmethode in Betracht, um dies prägnanter zu gestalten:
Anschließend können Sie die Ergebnisse im Collector Ihres Streams filtern:
Sie können die leeren
Optional
Objekte auch in Ihren Listen behalten. Wenn Sie dann ihren Index im neuenList<Optional<Long>>
(statt imList<Long>
) mit dem Original vergleichenList<String>
, können Sie die Zeichenfolge finden, die zu fehlerhaften Eingaben geführt hat. Sie können diese Fehler auch einfach anmeldenMyClass#parseLong
Wenn Sie jedoch den Wunsch haben, überhaupt keine schlechten Eingaben zu verarbeiten, ist es der Weg, den ich einschlagen würde, den gesamten Stream in dem zu umgeben, was Sie zu fangen versuchen (gemäß Namans Antwort).
quelle
Sie können
StringBuilder
mit Ausnahme einen for-Schlüssel erstellen und prüfen, ob er wieele
folgt numerisch ist.Ich hoffe es hilft.
quelle
Möglicherweise können Sie eine Hilfsmethode schreiben, mit der die Zeichenfolge auf numerische Werte überprüft und aus dem Stream herausgefiltert werden kann. Außerdem können Nullwerte gesammelt und schließlich in der Map erfasst werden.
Dies wird sich um alles kümmern.
Und verwenden Sie dies in Ihrem Stream.
quelle