如何避免在java lambda表达式中定义单元素数组

如何避免在java lambda表达式中定义单元素数组,java,arrays,java-8,java-stream,optional,Java,Arrays,Java 8,Java Stream,Optional,我已经编写了代码段,它从匹配某个条件的列表中获取单个元素。有没有办法用相同类型的对象替换单元素数组 final PromoSlotSize[] slot = new PromoSlotSize[1]; promoSlotSizeList.stream() .filter(promoSlotSize -> promoSlotSize.getOfferSet().equals(Constants.HVT_RATE_OFFER_SET)) .findFirst() .if

我已经编写了代码段,它从匹配某个条件的列表中获取单个元素。有没有办法用相同类型的对象替换单元素数组

final PromoSlotSize[] slot = new PromoSlotSize[1];
promoSlotSizeList.stream()
    .filter(promoSlotSize -> promoSlotSize.getOfferSet().equals(Constants.HVT_RATE_OFFER_SET))
    .findFirst()
    .ifPresent(p-> slot[0] =p);

你的方法似乎太过分了。请注意,使用

final PromoSlotSize[] slot = new PromoSlotSize[1];
使第一个也是唯一一个元素槽[0]=null为默认值。因此,您可以使用以下命令使流API返回第一个找到的对象PromotsLocate或null:

正如@YCF_L所说:您是否认识到流返回的对象可能会直接使用,而不是创建一个元素数组?如果不需要数组作为另一个方法/类的输入,请执行以下操作:

PromoSlotSize slot = promoSlotSizeList.stream()
          .filter(i-> i.getOfferSet().equals(Constants.HVT_RATE_OFFER_SET))
          .findFirst()
          .orElse(null);

你的方法似乎太过分了。请注意,使用

final PromoSlotSize[] slot = new PromoSlotSize[1];
使第一个也是唯一一个元素槽[0]=null为默认值。因此,您可以使用以下命令使流API返回第一个找到的对象PromotsLocate或null:

正如@YCF_L所说:您是否认识到流返回的对象可能会直接使用,而不是创建一个元素数组?如果不需要数组作为另一个方法/类的输入,请执行以下操作:

PromoSlotSize slot = promoSlotSizeList.stream()
          .filter(i-> i.getOfferSet().equals(Constants.HVT_RATE_OFFER_SET))
          .findFirst()
          .orElse(null);
一种方法是在PromosToSize类上创建一个copy from方法。该方法应该接受PromosToSize对象的和参数,并使用给定的PromosToSize数据自行填充该对象

final PromoSlotSize slot = new PromoSlotSize();
promoSlotSizeList.stream()
            .filter(promoSlotSize -> promoSlotSize.getOfferSet().equals(Constants.HVT_RATE_OFFER_SET))
            .findFirst().ifPresent(p-> slot.copy(p));
假设PromotsSize是您编写的一个类,这将允许您摆脱单元素数组。

一种方法是在PromotsSize类上创建一个from方法的副本。该方法应该接受PromosToSize对象的和参数,并使用给定的PromosToSize数据自行填充该对象

final PromoSlotSize slot = new PromoSlotSize();
promoSlotSizeList.stream()
            .filter(promoSlotSize -> promoSlotSize.getOfferSet().equals(Constants.HVT_RATE_OFFER_SET))
            .findFirst().ifPresent(p-> slot.copy(p));

假设PromotsLocale是您编写的一个类,这将允许您摆脱单元素数组。

代码使用了一个技巧,因为只有有效的最终变量可以从lambda的外部使用。因此,可以在其中设置第一个元素的最终数组。 实际上,它使用命令式编码,带有一个循环和一个结果

然而,下面的方法要好得多

Optional<PromoSlotSize> slot = promoSlotSizeList.stream()
                        .filter(i -> i.getOfferSet().equals(Constants.HVT_RATE_OFFER_SET))
                        .findAny();

slot.ifPresent(sl -> System.out.println("Slot present: " + sl));

因为它可以并行化,并且两个属性:boolean found+Slot result被合并到一个可选属性中。

代码使用了一个技巧,因为只有有效的最终变量可以从lambda的外部使用。因此,可以在其中设置第一个元素的最终数组。 实际上,它使用命令式编码,带有一个循环和一个结果

然而,下面的方法要好得多

Optional<PromoSlotSize> slot = promoSlotSizeList.stream()
                        .filter(i -> i.getOfferSet().equals(Constants.HVT_RATE_OFFER_SET))
                        .findAny();

slot.ifPresent(sl -> System.out.println("Slot present: " + sl));

因为它可以并行化,两个属性:boolean found+Slot result合并在一个可选属性中。

什么是PromoSlotSize和promoSlotSizeList!!为什么是1个元素的数组?而不仅仅是一种元素?@azro试试看。。。可能会抱怨最终结果;什么是PromotsSize和PromotsSizeList!!为什么是1个元素的数组?而不仅仅是一种元素?@azro试试看。。。可能会抱怨最终结果;请注意,如果您不关心在过滤器lambda有多个匹配项的情况下得到哪个实例,.findAny比findFirst更有效。findFirst处理整个流,然后返回找到的第一个流,其中as findAny将退出,并在找到匹配元素后立即返回,丢弃流的其余部分。@KevinSwan有任何文档支持此操作吗?这两种方法都从流中返回任意元素–除非流具有遭遇顺序,在这种情况下findFirst返回第一个元素。@KevinSwan再次阅读该博客,并向我们展示findFirst将在何处处理整个流?如果指定了遭遇顺序,则它必须处理整个流。如果它没有检查整个列表,那么它如何在排序后返回第一个呢?如何确保列表中不存在当前第一个候选元素之前的其他元素?findAny允许实现执行短路评估,并在找到匹配元素时立即终止,从而使其不具有确定性。这在这里是没有意义的,因为OP的示例没有指定遭遇顺序,但这是一个需要注意的重要区别。请注意,如果您不关心在过滤器lambda有多个匹配的情况下得到哪个实例,.findAny比findFirst更有效。findFirst处理整个流,然后返回找到的第一个流,其中as findAny将退出,并在找到匹配元素后立即返回,丢弃流的其余部分。@KevinSwan有任何文档支持此操作吗?这两种方法都从流中返回任意元素–除非流具有遭遇顺序,在这种情况下findFirst返回第一个元素。@KevinSwan再次阅读该博客,并向我们展示findFirst将在何处处理整个流?如果指定了遭遇顺序,则它必须处理整个流。如果它没有检查整个列表,那么它如何在排序后返回第一个呢?如何确保列表中不存在另一个可能会导致 埃德:现在的第一位候选人是谁?findAny允许实现执行短路评估,并在找到匹配元素时立即终止,从而使其不具有确定性。这在这里是没有意义的,因为OP的例子没有指定遭遇顺序,但这是一个需要注意的重要区别。