Я хочу подвести список целых чисел. Это работает следующим образом, но синтаксис не выглядит правильным. Может ли код быть оптимизирован?
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
чтобы избежать переполнения, в зависимости от значений, которые может иметь ваша карта.