Я хочу підсумувати список цілих чисел. Це працює так, але синтаксис не відчуває себе правильно. Чи можна оптимізувати код?
Map<String, Integer> integers;
integers.values().stream().mapToInt(i -> i).sum();
i -> iдуже зрозумілим, особисто. Ну, так, вам потрібно знати, що значення буде автоматично нерозфасовано, але це правда з Java 5 ...
foo(int i), не пишуть foo(myInteger.intValue());кожен раз, коли вони його викликають (або, принаймні, я не очікую !!). Я згоден з вами, що Integer::intValueє більш чітким, але я думаю, що це стосується і цього. Люди повинні просто засвоїти це один раз, і тоді ви закінчите :-). Це не так, якби це було якесь чарівне затуманення.
i -> iсхоже на неоперацію, а в принципі - це не-оп. Впевнений, що під капотом Integer.intValue()викликається, але ще глибше під кришкою, що методи отримують вказівку, щоб стати точно тим самим, що він схожий у вихідному коді. Integer::intValueмає бонусну точку не створювати синтетичний метод у байт-коді, але це не те, що повинно впливати на ваше рішення про організацію вихідного коду.
mapToLongщоб уникнути переливів, залежно від значень, які може мати ваша карта.