Fixed MapUsingReduce

Contract of Stream.reduce method requires that accumulator function
does not mutate its arguments. Previous implementation of
MapUsingReduce.map method was using accumulator and combiner
functions that were mutating list passed as argument. Mutating
parameters in accumulator and combiner functions results in
incorrect behaviour when parallel stream is processed.

New implementation of MapUsingReduce.map copies argument lists
in accumulator and combiner functions. This is very inefficient.
Stream.collect method could be used to implement more efficient
mutable reduction, but exercise 1 of chapter 3 asks to use reduce
method explicitly.

Unit test MapUsingReduceTest was updated to check functionality of
MapUsingReduce.map with parallel streams.
Fixed FilterUsingReduce

Contract of Stream.reduce method requires that accumulator function
does not mutate its arguments. Previous implementation of
FilterUsingReduce.filter method was using accumulator and combiner
functions that were mutating list passed as argument. Mutating
parameters in accumulator and combiner functions results in
incorrect behaviour when parallel stream is processed.

New implementation of FilterUsingReduce.filter copies argument lists
in accumulator and combiner functions. This is very inefficient.
Stream.collect method could be used to implement more efficient
mutable reduction, but exercise 1 of chapter 3 asks to use reduce
method explicitly.

Unit test FilterUsingReduceTest was updated to check functionality of
FilterUsingReduce.filter with parallel streams.
Merge pull request #4 from algirdasrascius/fix_MapUsingReduce

Fix answers to advanced exercises of chapter 3