Как создать 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);