2014-11-13 2 views
4

Я хочу суммировать все элементы в List<Integer> с помощью сокращения.Конкретный способ записи функций для арифметических операций в Java 8

В Scala можно написать

val result = list.reduce(_ + _) 

Есть ли способ, чтобы написать эту операцию в таком сжатом виде в Java8? Или я должен писать так?

int result = list.reduce((x,y) -> x + y)); 

ответ

7

Если вы специально хотите использовать сокращение, это будет делать:

list.stream().reduce(0, Integer::sum); // will return zero if list is empty 
list.stream().reduce(Integer::sum).get(); // will throw an exception if list is empty 

С суммированием является обычным явлением, существует несколько способов для этого:

list.stream().mapToInt(x->x).sum();  // mapToInt makes an IntStream 
list.stream().collect(summingInt(x->x)); // using a collector 
3

Вы можете использовать предопределенные sum() из IntStream:

int result = list.stream().mapToInt(Integer::intValue).sum(); 
0

Способ, который вы указали в своем вопросе ((x,y) -> x + y)), является столь же кратким, как и для лямбда.

Классы для примитивов в штучной упаковке имеют статические методы, которые выполняют некоторые из арифметических операций, хотя не все доступны. Те, которые присутствуют, могут использоваться с ссылкой на метод, например Integer::sum.

Еще одним способом было бы определить функцию самостоятельно и передать его в метод:

public static final BinaryOperator<Integer> SUM = Integer::sum; 
... 
list.reduce(SUM) 

Этот способ немного более кратким на месте использования, однако вы можете решить, если первоначальные затраты выписывая все функции, которые вам понадобятся, или нет.