¿Cómo obtengo un IntStream de una lista??

2 minutos de lectura

avatar de usuario
fredodesbordamiento

Puedo pensar en dos formas:

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

avatar de usuario
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.

    – BeeOnRope

    17 abr 2017 a las 20:08


Una forma alternativa de transformar eso sería usar Stream.flatMapToInt y IntStream.of como:

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

Nota: Revisé algunas preguntas vinculadas antes de publicar aquí y tampoco pude encontrar esta sugerencia en ellas.

¿Ha sido útil esta solución?

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
Privacidad