如何在Java lambda中映射多个变量?

如何在Java lambda中映射多个变量?,java,lambda,java-8,java-stream,optional,Java,Lambda,Java 8,Java Stream,Optional,我有一个在包含枚举的列表中进行筛选的方法 我 如您所见,我尝试根据其名称uffix过滤列表,过滤后,我希望将该值的宽度和高度映射到一个变量。但是代码是错误的,即使它有效,它也是如此丑陋 我可以在一个lambda中映射多个变量吗?如果是这样,我该如何实现这一点?首先,您的目标是删除重复的代码: availableImageSizes.stream() .filter(t -> t.getNameSuffix().equals("-xs"

我有一个在包含枚举的列表中进行筛选的方法 我

如您所见,我尝试根据其名称uffix过滤列表,过滤后,我希望将该值的宽度和高度映射到一个变量。但是代码是错误的,即使它有效,它也是如此丑陋


我可以在一个lambda中映射多个变量吗?如果是这样,我该如何实现这一点?

首先,您的目标是删除重复的代码:

availableImageSizes.stream()
                   .filter(t -> t.getNameSuffix().equals("-xs"))
                   .findFirst()
我不知道“一个兰巴”是什么意思。但是,您可以通过一系列
可选
方法调用来实现这一点。但是,您不能同时重新运行两个或多个值。解决方案是返回要分解为
宽度
高度
的数组。在更好的情况下,使用自定义对象
维度
/
类或
/
抽象映射。SimpleEntry

数组是显示解决方案的最简单方法

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
Integer[]dimensions=availableImageSizes.stream()
.filter(t->t.getNameSuffix().equals(“-xs”)//带后缀的图像
.findFirst()//可选
.map(obj->new Integer[]{obj.getWidth(),obj.getHeight()})//映射维度
.orElse(新整数[]{null,null});//其他默认值
整数宽度=维度[0];//非结构化宽度
整数高度=维度[1];//破坏高度

如果需要将值作为方法返回值的一部分

如果有合理的违约,我会这样做

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);
否则

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


您可以生成两个值的集合,也可以生成一个简单数组。或者甚至创建自己的类来表示这一点(Pair类非常流行)。取决于您想做什么以及如何处理此问题。作为旁注,
availableImageSizes.stream().filter(t->t.getNameSuffix().equals(“-xs”)).findFirst()
可能应该被提取出来,您可以对其执行
ifPresent
操作,也可以对该值执行链
/
或Else
/等操作。不需要生成三次。是否编译?如果将
null
赋值给
int
,它不会抛出错误吗?@VLAZ:是的,一个大的(对象)
整数
是可以为null的。小的(原语)
int
不是。真正的事实是
宽度
高度
也应该是
整数
,否则可能会返回NPE。无论如何,它是编译的。如果默认值不是
null
,而是
-1
,则可以使用
int
s,但这取决于操作。是的,我并不清楚这里的最终目标是什么。如果
.findFirst
生成一个空结果,应该怎么办。我个人只需要执行
width=result.map(x->x.getWidth()).orElse(0)
(或者任何合理的默认值),这样就不必将结果包装到额外的对象中,但这还取决于结果的位置和处理方式。如果这个结果被发送到其他地方,我会尽量避免将
Optional
传递给另一个方法,例如。@VLAZ:是的,这是另一种方法,看起来很不错。为什么不
availableImageSizes.stream().filter(t->t.getNameSuffix().equals(“-xs”).findFirst().ifPresent(obj->{int width=obj.getWidth(),height=obj.getHeight()/*宽度和高度随您的喜好而定*/})
Integer height = xsImageSize.map(ImageSize::getHeight).orElse(null);
Integer width = xsImageSize.map(ImageSize::getWidth).orElse(null);
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();
    //...
}
availableImageSizes.stream()
    .filter(t -> t.getNameSuffix().equals("-xs"))
    .findFirst()
    .ifPresent(imageSize -> {
        int height = imageSize.getHeight();
        int width = imageSize.getWidth();
        //...
    });
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();
    //...
}