2017-04-11 54 views
1

請看下面的例子:如果元素存在,Set.remove是否會返回false?

public Optional<User> getUser(Integer id) { 
    for(User user : usersSet) { 
     if(user.getId().equals(id)) return Optional.of(user); 
    } 
    return Optional.empty(); 
} 

public void deleteUser(Integer id) { 
    User user = getUser(id).orElseThrow(new RuntimeException("User not found")); 
    boolean result = usersSet.remove(user); 
} 

是否有其結果是虛假的情況下?

我問,因爲我不知道是否有必要檢查HashSet的remove方法的結果。

+0

順便說一句,如果你使用'Optional',無論如何,你可以做'users.stream()。filter(u - > u.getId() .equals(id))。findFirst();' – biziclop

+0

謝謝你的建議:)。 –

回答

3

不可以。如果元素存在,則無法獲得假。

如果你看看docs,它清楚地提到。

如果此集合包含指定的元素

+0

儘管如此,即使元素似乎存在,您也會得到'false',但可能的罪魁禍首是不正確的同步多線程應用程序代碼。 – biziclop

+0

但我在想,也許另一個線程會刪除這個對象,那麼結果將是錯誤的。它有道理嗎? –

+0

@DamianU您從未提及過您的多線程環境。嗯?是的,如果你用不同的線程來轟炸這個代碼是可能的。 –

2

usersSet可能是一個java.util.Set實例。
Set依靠equals()方法進行添加/刪除操作。

所以boolean result = usersSet.remove(user);將返回true只有User類,如果equals()是overrided使用相同的標準getUser()方法。
例如爲了簡化:return user.getId().equals(id);

0

是的。

在你的情況下,結果可能是假的,因爲你的users對象和userSet都是不同的。此外,它取決於你已經實施的方式equal()方法User

相關問題