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 -> ipersö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::intValueist 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 -> isieht 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::intValuehat 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.