2017-04-11 10 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

のためのメソッドequal()とにかく 'optional'を使用している場合は、' users.stream()。filter(u - > u.getId() .equals(id))。findFirst(); ' – biziclop

+0

アドバイスありがとう:)。 –

答えて

3

いいえ要素が存在する場合はfalseを返す方法はありません。

docsを見ると明らかです。

真のセットが、指定された要素

+0

要素が存在するように見えても、これにもかかわらず 'false'が返された場合、多分、マルチスレッドのアプリケーションコードが間違って同期されている可能性があります。 – biziclop

+0

しかし、別のスレッドがこのオブジェクトを削除すると、結果が偽になるかもしれないと私は考えていました。それは理にかなっていますか? –

+0

@DamianUあなたはあなたのマルチスレッド環境について言及したことはありません。ハァッ?はい、あなたは別のスレッドでこのコードを砲撃することは可能です。 –

2

usersSetはおそらくjava.util.Setインスタンスである含まれている場合。
Setは、追加/削除操作の方法としてequals()に依存しています。

従ってboolean result = usersSet.remove(user);getUser()メソッドと同じ基準を使用してequals()Userクラスを上書きする場合にのみtrueを返します。
たとえば、簡略化のために:return user.getId().equals(id);

0

はい。

オブジェクトとuserSetの両方が異なるため、結果が偽になる可能性があります。また、あなたが実装した方法に依存しますUserクラスの

関連する問題