Почему не удалось автоматически преобразовать тип Integer в тип Double в потоковом API Java8? - PullRequest
0 голосов
/ 26 апреля 2020

Что-то не так, если в коде есть значение типа Integer "4", если изменить "4" на "4.0", это нормально. Я думал, что целочисленный тип может автоматически преобразовываться в тип Double, но это не так. Так что же не так с моим предыдущим кодом?

Если в приведенном ниже коде есть целочисленный тип "4", ошибка происходит следующим образом:

Несовместимые типы: Число и Comparable> не может быть преобразован в double.

double minValue   = Stream.of(4, 0.1).reduce(Double.MAX_VALUE, Double::min);

НО Если я изменю «4» на Double типа «4.0», он будет работать хорошо.

double minValue   = Stream.of(4.0, 0.1).reduce(Double.MAX_VALUE, Double::min);

Ответы [ 2 ]

3 голосов
/ 26 апреля 2020

Это не работает, потому что не определено автоматическое преобразование между int и Double.

Из JLS 5.1.7 :

В частности, следующие девять преобразований называются преобразованиями в бокс:

  • От типа boolean к типу Boolean
  • От типа byte к типу Byte
  • От типа short к тип Short
  • От типа char к типу Character
  • От типа int к типу Integer
  • От типа long к типу Long
  • От типа float к типу Float
  • От типа double к типу Double
  • От типа null к типу null

Таким образом, 1 упаковано в Integer и предполагаемый тип вашего потока совпадает с типами в штучной упаковке Integer и Double: Number & Comparable<?>. (Технически это наименьшая верхняя граница типов)

Вместо этого вам нужно либо явно указать int себя (Double.valueOf(1)), либо привести его к double ((double) 1) или укажите его как двойной литерал (1.0).

0 голосов
/ 26 апреля 2020

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

Однако во втором примере вы указали в качестве входного значения double, поэтому вывод возможен без каких-либо ошибок.

См. Объяснение одного массива и потока ниже в битовой сложной структуре (двумерный массив)

double[][] doubleArray = Arrays.stream(intArray)
                               .map(arr -> Stream.of(arr).mapToDouble(Number::doubleValue).toArray())
                               .toArray(double[][]::new);

Это можно разложить следующим образом:

Сначала вы используете Arrays.stream для создать Stream<Number[]>. Затем для каждого Number[] вы создаете Stream<Number> и используете mapToDouble, чтобы получить DoubleStream, а затем toArray(), чтобы получить массив double[].

Последний вызов toArray преобразует этот Stream<double[]> в массив double[][].

Теперь для вашего кода.

    DoubleStream stream1 =     Stream.of(4, 0.1).mapToDouble(num -> (doub b le)num);
    stream1.forEach(System.out::println);

Ответ с мобильного телефона. Извините за неструктурированный ответ, но я думаю, что это помогает.

...