如何在Java lambda中映射多个变量?
我有一个在包含枚举的列表中进行筛选的方法 我 如您所见,我尝试根据其名称uffix过滤列表,过滤后,我希望将该值的宽度和高度映射到一个变量。但是代码是错误的,即使它有效,它也是如此丑陋如何在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"
我可以在一个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();
//...
}