Как получить поток из поплавка []
Я учился использовать java 8 потоков, когда заметил что-то странное.
Arrays.stream()
имеет методы для всех, кроме массивов с плавающей запятой:
-
Arrays.stream(int[]) : IntStream
-
Arrays.stream(long[]) : LongStream
-
Arrays.stream(double[]) : DoubleStream
Аналогично, существуют потоковые реализации для int, double и т.д., но не floats:
-
IntStream
-
LongStream
-
DoubleStream
Есть ли причина для этого?
Каков рекомендуемый способ работы с потоками с плавающей запятой?
Ответы
Ответ 1
от Java SE 8 for the Really Impatient
от Cay S. Horstmann:
2.12. Примитивные потоки типов
... Если вы хотите сохранить short, char, byte и boolean, используйте IntStream и для float используйте DoubleStream. Дизайнеры библиотек не думал, что стоит добавить еще пять типов потоков.
Ответ 2
Здесь лучший способ, который не требует копирования данных.
DoubleStream ds = IntStream.range(0, floatArray.length)
.mapToDouble(i -> floatArray[i]);
Ответ 3
Я задал себе этот вопрос. Чтобы ответить на него, я начал работать над библиотекой, которая включала такие вещи, как FloatToIntFunction и ByteToCharFunction и (конечно) FloatStream, CharStream, ByteStream и т.д. Это быстро стало для меня головной болью.
Это было бы много работы со стороны разработчиков библиотеки, чтобы сделать это, потому что вам нужно будет создавать методы и интерфейсы между всеми примитивными типами данных. По мере того как вы внедряете больше типов данных, они становятся все более и более беспорядочными. Представьте, что вам нужно внедрять методы перехода от float ко всем другим примитивным типам, двойным ко всем другим примитивным типам, char ко всем другим примитивным типам и т.д.
Долгосрочное решение для Java - это добавить типы значений, чтобы вы могли делать такие вещи, как Stream<int>
и Stream<float>
, а не использовать типы обёртки (Stream<Integer>
и Stream<float>
)
Взгляните на Project Vahalla на обновления этой функции, которые могут быть добавлены в Java в будущем.
http://openjdk.java.net/projects/valhalla/