Почему объявление переменной типа int требует приведения потока?длинный тип не требует приведения - PullRequest
0 голосов
/ 13 октября 2018

Почему один примитивный тип требует приведения, а другой нет?

/* This method uses stream operations to count how many numbers in a given array
* of integers are negative
*/    

public static void countNegatives(int[] nums) {
    long howMany = stream(nums) // or: int howMany = (int) stream(nums)
            .filter(n -> n < 0)
            .count();
    System.out.print(howMany);
}

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

count() возвращает long, и не каждый long может вписаться в int, поэтому для сохранения результата в int требуется явный приведение,Это не имеет ничего общего с Java-10.он всегда был там в предыдущих JDK.

Если вы не хотите разыгрывать, тогда альтернативой будет:

...
.filter(n -> n < 0)
.map(e -> 1)
.sum();

, но, как видно, это не так читабельно, как ваш примерпотому что код по существу говорит: «дайте мне суммирование элементов, которые проходят операцию фильтрации» вместо «дайте мне подсчет элементов, которые проходят операцию фильтрации».

Итак, в конечном итоге, если вам нужен результат как int , тогда переходите к приведению.

0 голосов
/ 13 октября 2018

Метод count() класса Java IntStream был определен для возврата значения long.Из документации :

long count () Возвращает количество элементов в этом потоке.Это особый случай редукции, который эквивалентен:

 return mapToLong(e -> 1L).sum();

Другими словами, так устроен Java, т. Е. Он не имеет ничего общего с Lambda.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...