2016-05-14 42 views
0
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(); 
} 

這並不工作的Java 8迭代流過濾器NoSuchElementException異常

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:沒有值存在」。

+1

我們怎麼知道?什麼是'FlawlordHelper'? 'findFirst()'的代碼是什麼? – UDKOX

+0

這只是意味着沒有值與謂詞匹配,並且您試圖在缺少的'Optional'上調用'get()'。 –

+0

第二個*「工作」*以什麼方式?它是否不會崩潰或它爲「速度」產生價值? – luk2302

回答

1

你不應該叫getOptional,因爲有可能不會導致和NoSuchElementException將被拋出,這使得那麼糟糕,因爲NPE,你可以使用Optional.map或代替。

findFirst返回一個可選項,因爲不能保證會找到一個元素。

迭代器是不同的,它們只在至少存在一個元素時迭代。

2

如果列表/迭代器/流不包含過濾器,則通過Optional返回findFirst將是空的,如果你通過get訪問值拋出該異常相匹配的元素。

+0

他說,它找到最後一個工作。如果它是空的,那對兩者都是。 – UDKOX

+0

@UDKOX我認爲OP使用「first」和「後者」來引用流和for循環代碼塊。 – wero