Как получить IntStream из списка <Integer>?

Я могу думать о двух путях:

public static IntStream foo(List<Integer> list)
{
    return list.stream().mapToInt(Integer::valueOf);
}

public static IntStream bar(List<Integer> list)
{
    return list.stream().mapToInt(x -> x);
}

Что такое идиоматический способ? Может быть, есть уже библиотечная функция, которая делает именно то, что я хочу?

Ответ 1

Я думаю (или, по крайней мере, это альтернатива), этот способ более эффективен:

public static IntStream baz(List<Integer> list)
{
    return list.stream().mapToInt(Integer::intValue);
}

поскольку функция Integer::intValue полностью совместима с ToIntFunction, так как она принимает Integer и возвращает int. Нет autoboxing.

Я также искал эквивалент Function::identity, я надеялся написать эквивалент вашего метода bar:

public static IntStream qux(List<Integer> list)
{
    return list.stream().mapToInt(IntFunction::identity);
}

но они не предоставили этот метод identity. Не знаю, почему.

Ответ 2

Альтернативный способ преобразования, который будет использовать Stream.flatMapToInt и IntStream.of как:

public static IntStream foobar(List<Integer> list) {
    return list.stream().flatMapToInt(IntStream::of);
}

Примечание: перед тем, как писать здесь, я перебрал несколько связанных вопросов, и я просто не смог найти в них ничего похожего.