I am a relatively new programmer and am currently working on something with the egit GitHub client library which requires me to iterate over a bunch of values and if a condition is met, add a bunch of stuff to a HashMap
then add it to a List
.
Example:
List<Map<String, Object>> files = new ArrayList<>();
for (TreeEntry file : fileList) {
if ("blob".equals(file.getType())) {
files.add(new HashMap<String, Object>() {
{
put("sha", file.getSha());
put("path", file.getPath());
put("name", GitHubHelper.getNameFromPath(file.getPath()));
put("size", Objects.toString(file.getSize()));
put("commits", GitHubHelper.getCommits(config, repo, file.getPath()));
}
});
}
}
As far as I understand it, this is almost the same as
Map<String, Object> map = new HashMap<>();
map.put(key, value)
with the only exception that the class is anonymous, which in this case doesn't bother me since I'm adding it to a list and returning it anyway.
Questions:
Is the Double-Brace Initialization example different in performance and, in this case in particular, is there any reason why I might choose to do it the regular way? As far as I understand DBI, this should be about the same in terms of performance or am I wrong?
Same as Question #1, however, what if in addition to all of this, in this end, I want to return two things as opposed to one. Does that change anything? In my case, I also want to return the repository object these files belong to.
return new HashMap<Repository, List<Map<String, Object>>>() { { put(repo, files); } };
To me, the code looks kind of nice like this. But it kind of feels as if this isn't really the right way. Is there any way I can do this better (tidier/more efficient performance-wise)?
-
\$\begingroup\$ Are you on Java 8? \$\endgroup\$h.j.k.– h.j.k.2015年10月27日 15:45:51 +00:00Commented Oct 27, 2015 at 15:45
-
1\$\begingroup\$ @h.j.k., yes I am. \$\endgroup\$Sam– Sam2015年10月27日 15:46:30 +00:00Commented Oct 27, 2015 at 15:46
-
2\$\begingroup\$ Welcome to Code Review! Please update the title with what your code does, not what specific question you have. Also possibly include a bit more code to give context; at the moment this a bit more on-topic for Stack Overflow. That said, otherwise your post looks good. \$\endgroup\$ferada– ferada2015年10月27日 15:55:17 +00:00Commented Oct 27, 2015 at 15:55
-
\$\begingroup\$ There are several Java client libraries for GitHub — which one are you using? \$\endgroup\$200_success– 200_success2015年10月28日 06:57:31 +00:00Commented Oct 28, 2015 at 6:57
-
\$\begingroup\$ @200_success , sorry I haven't included that, I didn't think it was relevant, but it's the Eclipse Egit lib. \$\endgroup\$Sam– Sam2015年10月28日 08:04:36 +00:00Commented Oct 28, 2015 at 8:04
1 Answer 1
Java 8
Since you are on Java 8, you should consider using its stream-based processing feature to achieve what you need in a more expressive way.
First, you need a method that accepts a TreeEntry
and gives you the desired Map
object:
private Map<String, Object> extractDetails(TreeEntry file) {
Map<String, Object> map = new HashMap<>();
map.put("sha", file.getSha());
map.put("path", file.getPath());
map.put("name", GitHubHelper.getNameFromPath(file.getPath()));
map.put("size", Objects.toString(file.getSize()));
map.put("commits", GitHubHelper.getCommits(config, repo, file.getPath()));
return map;
}
The idea here is to be able to use this as a method reference, e.g. ThisClass::extractDetails
, for map()
-ping the filter()
-ed elements, before collect()
-ing toList()
:
// Assuming fileList is a Collection implementation
List<Map<String, Object>> files = fileList.stream().filter(f -> "blob".equals(f.getType()))
.map(ThisClass::extractDetails)
.collect(Collectors.toList());
Double brace initialization
This StackOverflow question shows the pitfalls of using it. In short, yes, there will be a performance impact, and it doesn't end there. Due to the anonymous classes it creates, you may get an unusual number of compiled class files, and not to mention the small but significant gotchas surrounding class equivalence testing (potentially) and final
classes.
Explore related questions
See similar questions with these tags.