如何在java lambda中Map多个变量?

sbdsn5lh  于 2021-07-08  发布在  Java
关注(0)|答案(2)|浏览(280)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

上个月关门了。
改进这个问题
我有一个方法,它在包含枚举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();
}

如您所见,我尝试根据名称uffix对列表进行过滤,过滤之后,我希望将该值的宽度和高度Map到一个变量。但代码是错误的,即使它工作,它是如此丑陋。
我能在一个lambda中Map多个变量吗?如果是的话,我怎样才能做到这一点?

hmtdttj4

hmtdttj41#

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

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

我不知道“一只羔羊”是什么意思。但是,您可以通过一个 Stream 以及 Optional 方法调用。但是,不能同时重新运行两个或多个值。解决方案是返回要分解到的数组 width 以及 height . 最好使用自定义对象 Dimension / Point 类或 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
fhg3lkii

fhg3lkii2#

如果需要将这些值作为方法返回值的一部分
如果有合理的违约,我会这样做

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

如果返回时不需要这些值

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

相关问题