Как получить 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);
}
Примечание: перед тем, как писать здесь, я перебрал несколько связанных вопросов, и я просто не смог найти в них ничего похожего.