TimurMahammadov / google-collections

Automatically exported from code.google.com/p/google-collections
Apache License 2.0
0 stars 0 forks source link

putAll in StandardMultimap doesn't add an entry when empty collection is passed #44

Closed GoogleCodeExporter closed 9 years ago

GoogleCodeExporter commented 9 years ago
IMO the putAll on Multimaps should create always create an entry in the
keySet of the map, even when an empty collection or null is passed.

The reason I post this issue can be easily described by following code (I
came across a bug in our application that had the same logic - I simplified
it here)

Multimap<String, String> synonyms = Multimaps.newHashMultimap();
final String helloString = "hello";

//assume the synonymManager doesn't know any synonyms, 
//so an empty collection is returned
synonyms.putAll(helloString, synonymManager.getSynonyms(helloString));

this.printSynonyms(synonyms);

//when i want to print out the list, I wanted to show "hello" and next to
//it the synonyms. When there are no synonyms, I want to print out blank
//space

Obviously my issue was a lot complexer, but I hope you can see my problem...

Original issue reported on code.google.com by Koen.Ong...@gmail.com on 17 Dec 2007 at 11:13

GoogleCodeExporter commented 9 years ago
The current behavior is deliberate. Every key in the multimap must have at 
least one
value. It would be confusing if, for example, Multimap.keySet() included a key 
that
had no corresponding values in the multimap.

As a workaround, you could add a null value or a Null Object
<http://en.wikipedia.org/wiki/Null_Object_pattern> value to the multimap, 

Original comment by jared.l....@gmail.com on 17 Dec 2007 at 5:03

GoogleCodeExporter commented 9 years ago
bruceg111@yahoo.com made the following comment:
_________________________

I was interested in the google collections so I was reading through
this thread. I was wondering why you would say that every key must
have at least one value. In the reading I did, one of the reasons for
multi-map was to avoid code like:

Map m = ...
List l = (List)m.get("x");
if (l == null) {
 l = new ArrayList();
 m.put("x", l);
}
l.add("y");

In this scenario, it would allow "y" to have been null (I believe a
list can have at least one null element right?). And it could also use
the edge case to check for null and just use an empty array list as
the value. Either way, it seems like put() should never ignore data or
at least should throw an exception to signify to the caller that it is
illegal.

Regards,

Bruce
_________________________

Our multimap implementations have the following behavior when key isn't in the 
multimap:

1)  get(key) returns an empty collection

2)  get(key).put(value) adds the key-value mapping to the multimap

Will that handle the scenarios you're considering?

Original comment by jared.l....@gmail.com on 30 Dec 2007 at 8:17