Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

363
Vistas
¿Cómo mapear múltiples variables en Java lambda?

Tengo un método que filtra en una Lista que contiene enumeraciones i

 if (availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) .findFirst().isPresent()) { int width = availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) .findFirst().getWidth(); int height = availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) .findFirst().getHeight(); }

Como puede ver, trato de filtrar la lista de acuerdo con su NameSuffix y después de filtrar quiero asignar el ancho y alto de ese valor a una variable. Pero el código está mal y aunque funcione, es tan feo.

¿Puedo mapear múltiples variables en una lambda? Si es así, ¿cómo puedo lograr esto?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

Si necesita los valores como parte del valor de retorno del método

Si hay un valor predeterminado razonable, lo haría así

 Optional<ImageSize> xsImageSize = availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) .findFirst(); int height = xsImageSize.map(ImageSize::getHeight).orElse(-1); int width = xsImageSize.map(ImageSize::getWidth).orElse(-1);

Alternativamente, enteros anulables

 Integer height = xsImageSize.map(ImageSize::getHeight).orElse(null); Integer width = xsImageSize.map(ImageSize::getWidth).orElse(null);

De lo contrario

 Optional<ImageSize> xsImageSize = availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) .findFirst(); if (xsImageSize.isPresent()) { int height = xsImageSize.get().getHeight(); int width = xsImageSize.get().getWidth(); //... }

Si no necesita esos valores para la devolución

 availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) .findFirst() .ifPresent(imageSize -> { int height = imageSize.getHeight(); int width = imageSize.getWidth(); //... });

o

 availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) .findFirst() .ifPresent(this::processXsImageSize); //... private void processXsImageSize(ImageSize imageSize) { int height = imageSize.getHeight(); int width = imageSize.getWidth(); //... }
over 4 years ago · Santiago Trujillo Denunciar

0

En primer lugar, su objetivo es eliminar el código duplicado:

 availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) .findFirst()

No estoy seguro de lo que significa " en una lamba" . Sin embargo, puede lograr esto con una sola cadena de llamadas de método Stream y Optional . Sin embargo, no puede volver a ejecutar dos o más valores a la vez . La solución es devolver una matriz para descomponerla en width y height . En el mejor de los casos, use un objeto personalizado Dimension / Point class o Pair / AbstractMap.SimpleEntry .

Las matrices son la forma más fácil de mostrar la solución.

 Integer[] dimensions = availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs")) // images with a suffix .findFirst() // Optional<MyImage> .map(obj -> new Integer[] {obj.getWidth(), obj.getHeight()}) // map dimensions .orElse(new Integer[] {null, null}); // else default values Integer width = dimensions[0]; // destructured width Integer height = dimensions[1]; // destructured height
over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda