20.7.5. RemoteCache(.keySet|.entrySet|.values)
コレクションメソッド keySet、entrySet、および values はリモートキャッシュによってサポートされます。つまり、すべてのメソッドが RemoteCache に戻されるということです。これは、さまざまなキー、エントリ、または値を遅延して取得でき、ユーザーが望まない場合にそれらすべてを一度にクライアントメモリに保存する必要がないため便利です。これらのコレクションは、addおよびaddAllはサポートされていませんが、他のすべてのメソッドはサポートされているというMap仕様に準拠しています。
注記の 1 つとして、Iterator.remove メソッドおよび Set.remove メソッドまたは Collection.remove メソッドには、操作するサーバーに 1 つ以上のラウンドトリップが必要です。RemoteCache Javadoc を確認して、これらの方法と他のメソッドの詳細を確認することができます。
イテレーターの使用
これらのコレクションの iterator メソッドは、以下で説明されている retrieveEntries を内部で使用します。retrieveEntries がバッチサイズの引数を取る場合。これをイテレータに提供する方法はありません。このようなバッチサイズは、RemoteCacheManager の設定時にシステムプロパティー infinispan.client.hotrod.batch_size を使用するか、ConfigurationBuilder を使用して設定できます。
また、返される retrieveEntries イテレーターは Closeable です。keySet、entrySet、および values からのイテレーターは AutoCloseable バリアントを返します。したがって、これらの「Iterator」の使用が終了したら、常に閉じる必要があります。
try (CloseableIterator<Entry<K, V>> iterator = remoteCache.entrySet().iterator) {
...
}
try (CloseableIterator<Entry<K, V>> iterator = remoteCache.entrySet().iterator) {
...
}
バッキングコレクションではなく、ディープコピーが必要な場合
以前のバージョンの RemoteCache では、keySet のディープコピーの取得が許可されました。これは新しいバッキングマップでも可能です。コンテンツを自分でコピーするだけです。また、これまでサポートしていなかったentrySetおよびvaluesを使用してこれを行うこともできます。
Set<K> keysCopy = remoteCache.keySet().stream().collect(Collectors.toSet());
Set<K> keysCopy = remoteCache.keySet().stream().collect(Collectors.toSet());
鍵が多数ある場合があり、クライアントで OutOfMemoryError が発生する可能性があるため、細心に注意を払ってください。
Set keys = remoteCache.keySet();
Set keys = remoteCache.keySet();