如何在 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” 是什么意思。但是,您可以使用 Stream
和 Optional
方法调用的单个链来实现此目的。但是,您不能一次返回两个或多个值。解决方案是 return 要么将一个数组分解为 width
和 height
。在更好的情况下使用自定义对象 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();
//...
}
我有一个方法可以过滤包含枚举的列表 我
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” 是什么意思。但是,您可以使用 Stream
和 Optional
方法调用的单个链来实现此目的。但是,您不能一次返回两个或多个值。解决方案是 return 要么将一个数组分解为 width
和 height
。在更好的情况下使用自定义对象 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();
//...
}