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);
}
¿Qué es la forma idiomática? ¿Quizás ya existe una función de biblioteca que hace exactamente lo que quiero?
Otra forma posible podría ser usar flatMapToInt junto con Instream.of
– Namán
21 de diciembre de 2018 a las 3:30
gontardo
Supongo (o al menos es una alternativa) de esta manera es más eficaz:
public static IntStream baz(List<Integer> list)
{
return list.stream().mapToInt(Integer::intValue);
}
ya que la función Integer::intValue es totalmente compatible con ToIntFunction ya que se necesita un Integer y devuelve un int. No autoboxeo es interpretado.
También estaba buscando un equivalente de Function::identityesperaba escribir un equivalente de tu bar método :
public static IntStream qux(List<Integer> list)
{
return list.stream().mapToInt(IntFunction::identity);
}
pero no proporcionaron esto identity método. No sé por qué.
jajaja me confundí Integer::valueOf con Integer::intValue. Mi función propuesta foo desempaqueta el Integer en la lista para pasarlo a valueOfluego se devuelve en una caja y luego se desempaqueta otra vez para ser puesto en la corriente 🙂
– fredo desbordamiento
8 de julio de 2014 a las 15:01
@shmosel porque no se realiza autoboxing por intValue
– gontardo
9 de marzo de 2016 a las 8:48
¿Qué autoboxeo? En la versión lambda, x ya es un número entero (de la Lista), y “devuelve x” implícitamente _un_boxes a un int, usando intValue. Sospecho que la diferencia comenzaría siendo imperceptiblemente pequeña y se haría más pequeña cuando el JIT haya terminado.
– yshavit
9 de marzo de 2016 a las 8:59
@yshavit sin mencionar que una función de identidad también haría exactamente lo mismo.
– shmosel
9 de marzo de 2016 a las 9:19
@VictorZamanian: no hay boxeo allí. El valor comienza como Integer en la lista, y se pasa a ToIntFunction.applyAsInt(T value)que acepta un objeto y devuelve int entonces no hay boxeo para convertir Integer a T mientras llama eso. Entonces la función lambda x -> x toma un Integer x y lo devuelve, lo que significa que está desempaquetado para cumplir con el int tipo de retorno. No hay más boxing o unboxing. Una razón válida para preferir Integer::intValue es que no se crea ninguna función lambda adicional: la referencia del método se puede usar directamente.
Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos.
Configurar y más información
Otra forma posible podría ser usar
flatMapToInt
junto conInstream.of
– Namán
21 de diciembre de 2018 a las 3:30