Как создать IntStream из Set?
в настоящее время я делаю это:
Set<Integer> integers = ... // sourced from elsewhere in code
IntStream intStream = integers.stream().mapToInt(value -> value);
кажется избыточным сопоставлять значение со значением, чтобы преобразовать Stream<Integer>
to IntStream
. Есть ли способ сделать это без того избыточных ?
1 ответов
нет, вы должны использовать .mapToInt(value -> value)
или (выглядит лучше меня) .mapToInt(Integer::intValue)
. As Stream
является универсальным классом, он должен работать для любого универсального типа элемента потока, поэтому невозможно добавить что-то более простое в API безопасным для типа способом. Рассмотрим, например, что есть asIntStream()
метод Stream
интерфейс. Это, конечно, будет выглядеть лучше:
IntStream intStream = integers.stream().asIntStream();
однако ничто не помешает вам вызвать такой метод для Stream<String>
например. В Java нет способа включить вызов метод только для определенного универсального параметра. Таким образом, вызов его случайно в потоке другого типа будет компилироваться нормально, но приведет к исключению среды выполнения, которое плохо на статически типизированном языке. Однако использование .mapToInt(value -> value)
или .mapToInt(Integer::intValue)
вы заставляете проверку типа: вы должны предоставить функцию, которая возвращает int
, так что stringStream.mapToInt(value -> value)
правильно сообщает об ошибке компиляции.
если вы действительно заботитесь, вы можете создать статический метод в вашем проекте, как это:
public class Streams {
public static IntStream intStream(Collection<Integer> c) {
return c.stream().mapToInt(Integer::intValue);
}
}
и использовать его как
IntStream intStream = Streams.intStream(integers);