Map Reduce in parallel
Description
Java Streams API supports map reduce operations in parallel.
When using the following reduce method, each thread accumulates the partial results using the accumulator. At the end, the combiner is used to combine the partial results from all threads to get the result.
<U> U reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
Example
The following code shows how the sequential and parallel reduce operation works.
import java.time.LocalDate;
import java.time.Month;
import java.util.Arrays;
import java.util.List;
//w w w.j av a2s . c o m
public class Main {
public static void main(String[] args) {
double sum = Employee
.persons()
.stream()
.reduce(
0.0,
(Double partialSum, Employee p) -> {
double accumulated = partialSum + p.getIncome();
System.out.println(Thread.currentThread().getName()
+ " - Accumulator: partialSum = " + partialSum
+ ", person = " + p + ", accumulated = " + accumulated);
return accumulated;
},
(a, b) -> {
double combined = a + b;
System.out.println(Thread.currentThread().getName()
+ " - Combiner: a = " + a + ", b = " + b
+ ", combined = " + combined);
return combined;
});
System.out.println("--------------------------------------");
System.out.println(sum);
sum = Employee
.persons()
.parallelStream()
.reduce(
0.0,
(Double partialSum, Employee p) -> {
double accumulated = partialSum + p.getIncome();
System.out.println(Thread.currentThread().getName()
+ " - Accumulator: partialSum = " + partialSum
+ ", person = " + p + ", accumulated = " + accumulated);
return accumulated;
},
(a, b) -> {
double combined = a + b;
System.out.println(Thread.currentThread().getName()
+ " - Combiner: a = " + a + ", b = " + b
+ ", combined = " + combined);
return combined;
});
System.out.println(sum);
}
}
class Employee {
public static enum Gender {
MALE, FEMALE
}
private long id;
private String name;
private Gender gender;
private LocalDate dob;
private double income;
public Employee(long id, String name, Gender gender, LocalDate dob,
double income) {
this.id = id;
this.name = name;
this.gender = gender;
this.dob = dob;
this.income = income;
}
public double getIncome() {
return income;
}
public static List<Employee> persons() {
Employee p1 = new Employee(1, "Jake", Gender.MALE, LocalDate.of(1971,
Month.JANUARY, 1), 2343.0);
Employee p2 = new Employee(2, "Jack", Gender.MALE, LocalDate.of(1972,
Month.JULY, 21), 7100.0);
Employee p3 = new Employee(3, "Jane", Gender.FEMALE, LocalDate.of(1973,
Month.MAY, 29), 5455.0);
Employee p4 = new Employee(4, "Jode", Gender.MALE, LocalDate.of(1974,
Month.OCTOBER, 16), 1800.0);
Employee p5 = new Employee(5, "Jeny", Gender.FEMALE, LocalDate.of(1975,
Month.DECEMBER, 13), 1234.0);
Employee p6 = new Employee(6, "Jason", Gender.MALE, LocalDate.of(1976,
Month.JUNE, 9), 3211.0);
List<Employee> persons = Arrays.asList(p1, p2, p3, p4, p5, p6);
return persons;
}
}
The code above generates the following result.