Ich möchte eine Liste von ganzen Zahlen zusammenfassen. Es funktioniert wie folgt, aber die Syntax fühlt sich nicht richtig an. Könnte der Code optimiert werden?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
i -> i
persönlich sehr klar. Nun ja, Sie müssen wissen, dass der Wert automatisch entpackt wird, aber es ist wahr seit Java 5 ...
foo(int i)
schreiben nicht foo(myInteger.intValue());
jedes Mal , wenn sie sie aufrufen (oder zumindest erwarte ich das nicht !!). Ich stimme Ihnen zu, das Integer::intValue
ist expliziter, aber ich denke, das gilt auch hier. Die Leute sollten es nur einmal lernen und dann bist du fertig :-). Es ist nicht so, als wäre es eine magische Verschleierung.
i -> i
sieht aus wie ein no-op und konzeptuell, es ist ein No-op. Sicher, unter der Haube Integer.intValue()
wird aufgerufen, aber noch tiefer unter der Haube werden diese Methoden eingefügt, um genau das No-Op zu werden, wie es im Quellcode aussieht. Integer::intValue
hat den Bonuspunkt, keine synthetische Methode im Bytecode zu erstellen, aber es ist nicht das, was Ihre Entscheidung über die Organisation Ihres Quellcodes beeinflussen sollte.
mapToLong
, um Überläufe zu vermeiden, abhängig von den Werten, die Ihre Karte haben kann.