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?
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(); //... }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