Java 8 Iterator流过滤器NoSuchElementException

时间:2016-05-14 19:09:44

标签: java iterator java-stream

    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”。

2 个答案:

答案 0 :(得分:2)

如果list / iterator / stream不包含与过滤器匹配的元素,则Optional返回的findFirst将为空,如果通过{{1}访问该值,则抛出该异常}。

答案 1 :(得分:1)

你不应该在get上拨打Optional,因为可能没有结果而且会抛出NoSuchElementException,这会像NPE一样糟糕,你可以使用{{1}或者Optional.map代替。{/ p>

Optional.isPresent返回一个Optional,因为无法保证找到一个元素。

迭代器不同,只有至少有一个元素才会迭代。