public static double getAttackSpeed(ItemStack item) {
Attributes ab = new Attributes(item);
for(Attributes.Attribute attribute : ab.values())
Flawlord.log(attribute.getName());
return FlawlordHelper.stream(ab.values()).filter(a -> a.getAttributeType().equals(Attributes.AttributeType.GENERIC_ATTACK_SPEED)).findFirst().get().getAmount();
}
这不起作用
public static int getDamage(ItemStack item) {
Attributes ab = new Attributes(item);
int dmg = 0;
for(Attributes.Attribute attribute : ab.values())
if (attribute.getAttributeType() == Attributes.AttributeType.GENERIC_ATTACK_DAMAGE)
dmg = (int) attribute.getAmount();
return dmg;
}
这是有效的
您好。谁可以向我解释为什么后者有效,但第一个不行?也许我只是没有得到它,idk。我想也许.equals()在这里不起作用?
如果我使用lambda的第一个,我得到一个异常“NoSuchElementException:No value present”。
答案 0 :(得分:2)
如果list / iterator / stream不包含与过滤器匹配的元素,则Optional
返回的findFirst
将为空,如果通过{{1}访问该值,则抛出该异常}。
答案 1 :(得分:1)
你不应该在get
上拨打Optional
,因为可能没有结果而且会抛出NoSuchElementException
,这会像NPE一样糟糕,你可以使用{{1}或者Optional.map
代替。{/ p>
Optional.isPresent
返回一个Optional,因为无法保证找到一个元素。
迭代器不同,只有至少有一个元素才会迭代。