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

How to map multiple variable in Java lambda?

我有一个方法可以过滤包含枚举的列表 我

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

如您所见,我尝试根据其 NameSuffix 过滤列表,过滤后我想将该值的宽度和高度映射到一个变量。但是代码错了,就算能用,也太丑了。

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

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

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

我不确定“in one lamba” 是什么意思。但是,您可以使用 StreamOptional 方法调用的单个链来实现此目的。但是,您不能一次返回两个或多个值。解决方案是 return 要么将一个数组分解为 widthheight。在更好的情况下使用自定义对象 Dimension/Point class 或 Pair/AbstractMap.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

如果您需要这些值作为方法 return 值的一部分

如果有合理的默认设置,我会这样做

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

或者,可为空的整数

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

如果 return

不需要这些值
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();
    //...
}