Skip to content

Commit 8503b1a

Browse files
committed
Added a rudimentary Map/Reduce example
1 parent fe3ac34 commit 8503b1a

File tree

1 file changed

+74
-0
lines changed

1 file changed

+74
-0
lines changed
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
package com.rampatra.misc;
2+
3+
import java.util.Arrays;
4+
import java.util.HashMap;
5+
import java.util.List;
6+
import java.util.Map;
7+
import java.util.stream.Collectors;
8+
9+
/**
10+
* A rudimentary example explaining the concept of Map/Reduce paradigm. The question is, provided a list of Person
11+
* objects from various countries, compute the total population in each country.
12+
*
13+
* @author rampatra
14+
* @since 2019-02-26
15+
*/
16+
public class MapReduce {
17+
18+
private static class Person {
19+
String name;
20+
int age;
21+
String country;
22+
23+
Person(String country) {
24+
this.country = country;
25+
}
26+
}
27+
28+
/**
29+
* The mapper function will take all the data and output only the information which we need, and in this
30+
* case, it is just the country name to which a person belongs.
31+
*
32+
* @param personList a list of all persons
33+
* @return a list of country names
34+
*/
35+
private static List<String> mapper(List<Person> personList) {
36+
return personList.stream().map(person -> person.country).collect(Collectors.toList());
37+
}
38+
39+
/**
40+
* The reducer function will take all the useful information from the mapper function and then compute the result
41+
* we need. In this case, it is to count the number of persons in each country.
42+
*
43+
* @param countryNamesOfAllPersons a list of country names taken out of all {@code Person} objects
44+
* @return a map containing country names as the keys and their resp. population as values
45+
*/
46+
private static Map<String, Integer> reducer(List<String> countryNamesOfAllPersons) {
47+
Map<String, Integer> countryToPopulationMap = new HashMap<>();
48+
49+
countryNamesOfAllPersons.forEach(countryName -> {
50+
countryToPopulationMap.computeIfPresent(countryName, (country, population) -> population + 1);
51+
countryToPopulationMap.computeIfAbsent(countryName, country -> countryToPopulationMap.put(country, 1));
52+
});
53+
54+
return countryToPopulationMap;
55+
}
56+
57+
/**
58+
* Just to print the output.
59+
*
60+
* @param countryToPopulationMap a map containing country names as the keys and their resp. population as values
61+
*/
62+
private static void printPopulation(Map<String, Integer> countryToPopulationMap) {
63+
countryToPopulationMap.forEach((k, v) -> System.out.println(k + ": " + v));
64+
}
65+
66+
public static void main(String[] args) {
67+
68+
Person[] persons = new Person[]{new Person("India"), new Person("Ireland"),
69+
new Person("Sweden"), new Person("United States"), new Person("India"),
70+
new Person("Ireland"), new Person("India")};
71+
72+
printPopulation(reducer(mapper(Arrays.asList(persons))));
73+
}
74+
}

0 commit comments

Comments
 (0)