THRIFT-288. java: Generated code iterates maps during write inefficiently
Newly generated code will now use entrySet instead of keySet when serializing maps. Existing generated classes does not need to be regenerated, though they won't reap the performance improvements unless they do.
git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@738765 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/compiler/cpp/src/generate/t_java_generator.cc b/compiler/cpp/src/generate/t_java_generator.cc
index e99583a..81fb590 100644
--- a/compiler/cpp/src/generate/t_java_generator.cc
+++ b/compiler/cpp/src/generate/t_java_generator.cc
@@ -2467,10 +2467,11 @@
string iter = tmp("_iter");
if (ttype->is_map()) {
indent(out) <<
- "for (" <<
- type_name(((t_map*)ttype)->get_key_type()) << " " << iter <<
+ "for (Map.Entry<" <<
+ type_name(((t_map*)ttype)->get_key_type(), true, false) << ", " <<
+ type_name(((t_map*)ttype)->get_val_type(), true, false) << "> " << iter <<
" : " <<
- prefix << ".keySet())";
+ prefix << ".entrySet())";
} else if (ttype->is_set()) {
indent(out) <<
"for (" <<
@@ -2518,9 +2519,9 @@
t_map* tmap,
string iter,
string map) {
- t_field kfield(tmap->get_key_type(), iter);
+ t_field kfield(tmap->get_key_type(), iter + ".getKey()");
generate_serialize_field(out, &kfield, "");
- t_field vfield(tmap->get_val_type(), map + ".get(" + iter + ")");
+ t_field vfield(tmap->get_val_type(), iter + ".getValue()");
generate_serialize_field(out, &vfield, "");
}