私のコードにMap<String, List<String>>
があります。マップの#get()
メソッドがヌルの代わりに空のリストを返した場合、潜在的なヌルポインタを避けることができます。 Java APIにこれと同じものはありますか?私はちょうどHashMap
を延長するべきですか?nullの代わりにデフォルト値を返すJavaマップの実装
答えて
@ Jonの答えは、あなたが直接聞いていることをする良い方法です。
しかし、あなたが実装しようとしているものは "マルチマップ"です。すなわち、キーから値の集合へのマッピングである。その場合は、GuavaまたはApacheのコモンズコレクションのマルチマップクラスも参照する必要があります。
ルックで:
com.google.common.collect.Multimap
インターフェイスとその実装、またはorg.apache.commons.collections.MultiMap
インタフェースとその実装。org.apache.commons.collections4.MultiMap
インターフェイスとその実装(以前のMultiMapの新しいバージョン、v4で導入されました)。
コメントで述べたように:
グアバのコンピューティング・マップの概念は
LoadingCache
で取って代わられました。また、Java 8マップのインターフェイスのnicecomputeIfAbsent
地図の契約を破らず、遅延評価機能を備えていないデフォルトのメソッドに導入されました。
Guavaは、それが存在しない場合は、値を提供するために、関数を実行します「コンピューティング・マップ」のアイデアを持っていました。それはMapMaker.makeComputingMap
で実装されました。詳細はCacheBuilder.build
を参照してください。CacheBuilder
を使用することができます。
それはあなたが後にしている何のためにやり過ぎかもしれ - あなただけがMap
(組成物を用いてではなく、任意の特定の実装を拡張する)を持っており、それがないならば、単にデフォルトを返すMap
実装を記述したほうが良いかもしれませんプレゼント。 get
以外のすべてのメソッドは、おそらく他のマップに委任することができます:
public class DefaultingMap<K, V> implements Map<K, V>
{
private final Map<K, V> map;
private final V defaultValue;
public DefaultingMap(Map<K, V> map, V defaultValue)
{
this.map = map;
this.defaultValue = defaultValue;
}
@Override public V get(Object key)
{
V ret = map.get(key);
if (ret == null)
{
ret = defaultValue;
}
return ret;
}
@Override public int size()
{
return map.size();
}
// etc
}
注意:これにより、get()の規約が破られます。マップにキーが含まれていない場合は、nullが返されます。適合するためには 'containsKey()'をオーバーライドして*常に* trueを返してください。私は 'makeComputingMap()'もそれを行うと思いますが、明示的にドキュメント内に記述されていないと思います。 –
@マーク:おそらく。しかし、キーを反復することで、トリッキーになりますが、基本的には遅かれ早かれ抽象化が中断します。 *どこで*あなたはそれが間違いなく深い配慮のために問題になるでしょう:) –
'/ etc 'は小さくないので、この解決策は実用的ではありません。 –
をあなたが単にあなたが望む値を取得するには、ラッパー関数を記述し、それがnull
だ場合は代わりにデフォルト値を返すことができるように私には思えます。
Map<String, List<String>> myMap = new Map<String, List<String>>();
public List<String> myGet(String key) {
List<String> ret = myMap.get(key);
if(ret == NULL) {
return defaultList(); // where defaultList is a function that generates your default list.
}
return ret;
}
これは、それはあなたが、あなたはまた、MyMap
のようなものにMap
またはHashMap
を拡張することができ、ちょうどこの余分な機能を備えて欲しいものではありません場合は、あなたのmyMap
は、(簡単のために)グローバル変数であることを前提としています。そうすれば、MyMap
オブジェクトがインスタンス化されている場所からでも使用できます。
ええと、上に挙げたデコレータのパターンは、もっと良いアイデアのようです... – Argote
マップが必要なものにマップを渡す必要がある場合、これはあまり役に立ちません。 –
動作を変更する場合は、getメソッドをオーバーライドするだけで、以前の投稿と同様です。
Map<String, List<String>> map = new LinkedHashMap<String, List<String>>() {
public String get(Object key) {
List<String> list = super.get(key);
if (list == null && key instanceof String)
super.put(key, list = new ArrayList<String>());
return list;
}
};
グアバには、あなたが望むものを正確に行う方法があります。これはArgote's answerに似ています。
Map<String, List<String>> myMap = ...
Functions.forMap(myMap, Arrays.asList("default", "value"));
default
方法のおかげで、Javaの8は今、これはMap::getOrDefault
で構築されています
Map<Integer, String> map = ...
map.put(1, "1");
System.out.println(map.getOrDefault(1, "2")); // "1"
System.out.println(map.getOrDefault(2, "2")); // "2"
これはグアバを必要としないので、これは最もスリムな答えです。そして、それは私が探していたものでした。アップボーニング。 –
これはタイミングに基づいているように見えますが、これは最善の解決策ですが、遅れてパーティーに来ました(感謝のJava 8!)。私はそのシンプルさが好きです。 +1 –
- 1. mysqli_fetch_array()はCOUNT()の値の代わりにNULLを返します
- 2. 単一値の代わりに配列を返すscala/sparkマップ
- 3. Java - 必要な値の代わりにStringにnullを代入するコンストラクタ
- 4. パンダがデフォルト値の代わりに
- 5. TypeScript宣言の代わりに実装
- 6. デフォルトの列の値の代わりにNULLが挿入されました
- 7. SQLの除算で数値の代わりにNULL値が返される
- 8. Mercurial。放棄 - 代わりの実装ブランチプラクティス?
- 9. OUTER JOINをNULLの代わりに0を返す方法
- 10. yams-cpp値の代わりにマップを返すネストされたシーケンス
- 11. ConfigurationManagerは文字列値の代わりにnullを返します
- 12. STR_TO_DATEはNULLの代わりにエラーを返します
- 13. Count()はNULLの代わりに0を返します。
- 14. MockMvcはオブジェクトの代わりにnullを返します
- 15. WP7 - Webサービスコールはコレクションの代わりにnullを返します。
- 16. v.getTag()は、ViewHolderの代わりにnullを返します。
- 17. Firebaseはデータの代わりにnullを返しています
- 18. Javaジェネリックインターフェイスは、タイプTの代わりにオブジェクトを実装します
- 19. 構造マップはデフォルトのものの代わりに名前付きのインスタンスを返します
- 20. Java HashTable実装のgetメソッドはnullを返しますか?
- 21. Java 8戻り値nullを返す
- 22. each()の代わりにjquery live()を実装する方法
- 23. スタティックカラーの代わりにカラーピッカーを実装する方法
- 24. window.location.href.split( '/')ポップ()特殊文字を返す代わりに、実際の値の
- 25. 「NULL」の代わりに、Matlabの
- 26. ナビゲーション・ドロワーのフラグメントの代わりにアクティビティーを実装
- 27. java印刷の代わりに0の代わりに
- 28. 約束の代わりにAsyncStorage(getItem)のキーの値を返す
- 29. MySQL C APIはNULL値ではなくNULLの代わりにゼロを返します
- 30. RestTemplateをマップの代わりにマップにマッピングする
Decoratorパターンを使用すると、おそらく私はあなたを疑わないのHashMap ... – kem
を拡張するよりも良いだろう、なぜそれが良いのでしょうか? –
@jk:どうしてあなたは自分をHashMapにしたいのですか?時にはLinkedHashMapが必要な場合はどうなりますか?またはConcurrentHashMap?またはTreeMap?基本的には、継承よりも構図を好む:) –