diff --git a/pom.xml b/pom.xml index 10e5035e..37cbf712 100644 --- a/pom.xml +++ b/pom.xml @@ -37,8 +37,8 @@ maven-compiler-plugin 3.1 - 1.9 - 1.9 + 1.8 + 1.8 diff --git a/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java b/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java index d2940969..42651b46 100644 --- a/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java +++ b/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java @@ -1,25 +1,25 @@ -package lambdasinaction.chap10; - -import java.util.*; - -import static java.util.Optional.of; -import static java.util.Optional.empty; - -public class OperationsWithOptional { - - public static void main(String... args) { - System.out.println(max(of(3), of(5))); - System.out.println(max(empty(), of(5))); - - Optional opt1 = of(5); - Optional opt2 = opt1.or(() -> of(4)); - - System.out.println( - of(5).or(() -> of(4)) - ); - } - - public static final Optional max(Optional i, Optional j) { - return i.flatMap(a -> j.map(b -> Math.max(a, b))); - } -} +//package lambdasinaction.chap10; +// +//import java.util.*; +// +//import static java.util.Optional.of; +//import static java.util.Optional.empty; +// +//public class OperationsWithOptional { +// +// public static void main(String... args) { +// System.out.println(max(of(3), of(5))); +// System.out.println(max(empty(), of(5))); +// +// Optional opt1 = of(5); +// Optional opt2 = opt1.or(() -> of(4)); +// +// System.out.println( +// of(5).or(() -> of(4)) +// ); +// } +// +// public static final Optional max(Optional i, Optional j) { +// return i.flatMap(a -> j.map(b -> Math.max(a, b))); +// } +//} diff --git a/src/main/java/lambdasinaction/chap10/OptionalMain.java b/src/main/java/lambdasinaction/chap10/OptionalMain.java index dcd97792..56d742eb 100644 --- a/src/main/java/lambdasinaction/chap10/OptionalMain.java +++ b/src/main/java/lambdasinaction/chap10/OptionalMain.java @@ -1,24 +1,24 @@ -package lambdasinaction.chap10; - -import java.util.*; - -import static java.util.stream.Collectors.toSet; - -public class OptionalMain { - - public String getCarInsuranceName(Optional person) { - return person.flatMap(Person::getCar) - .flatMap(Car::getInsurance) - .map(Insurance::getName) - .orElse("Unknown"); - } - - public Set getCarInsuranceNames(List persons) { - return persons.stream() - .map(Person::getCar) - .map(optCar -> optCar.flatMap(Car::getInsurance)) - .map(optInsurance -> optInsurance.map(Insurance::getName)) - .flatMap(Optional::stream) - .collect(toSet()); - } -} +//package lambdasinaction.chap10; +// +//import java.util.*; +// +//import static java.util.stream.Collectors.toSet; +// +//public class OptionalMain { +// +// public String getCarInsuranceName(Optional person) { +// return person.flatMap(Person::getCar) +// .flatMap(Car::getInsurance) +// .map(Insurance::getName) +// .orElse("Unknown"); +// } +// +// public Set getCarInsuranceNames(List persons) { +// return persons.stream() +// .map(Person::getCar) +// .map(optCar -> optCar.flatMap(Car::getInsurance)) +// .map(optInsurance -> optInsurance.map(Insurance::getName)) +// .flatMap(Optional::stream) +// .collect(toSet()); +// } +//} diff --git a/src/main/java/lambdasinaction/chap6/CollectorHarness.java b/src/main/java/lambdasinaction/chap6/CollectorHarness.java index 8370be16..46bab3b0 100644 --- a/src/main/java/lambdasinaction/chap6/CollectorHarness.java +++ b/src/main/java/lambdasinaction/chap6/CollectorHarness.java @@ -1,23 +1,23 @@ -package lambdasinaction.chap6; - -import java.util.function.*; - -public class CollectorHarness { - - public static void main(String[] args) { - //System.out.println("Partitioning done in: " + execute(PartitionPrimeNumbers::partitionPrimes) + " msecs"); - System.out.println("Partitioning done in: " + execute(PartitionPrimeNumbers::partitionPrimesWithCustomCollector) + " msecs" ); - } - - private static long execute(Consumer primePartitioner) { - long fastest = Long.MAX_VALUE; - for (int i = 0; i < 10; i++) { - long start = System.nanoTime(); - primePartitioner.accept(1_000_000); - long duration = (System.nanoTime() - start) / 1_000_000; - if (duration < fastest) fastest = duration; - System.out.println("done in " + duration); - } - return fastest; - } -} +//package lambdasinaction.chap6; +// +//import java.util.function.*; +// +//public class CollectorHarness { +// +// public static void main(String[] args) { +// //System.out.println("Partitioning done in: " + execute(PartitionPrimeNumbers::partitionPrimes) + " msecs"); +// System.out.println("Partitioning done in: " + execute(PartitionPrimeNumbers::partitionPrimesWithCustomCollector) + " msecs" ); +// } +// +// private static long execute(Consumer primePartitioner) { +// long fastest = Long.MAX_VALUE; +// for (int i = 0; i < 10; i++) { +// long start = System.nanoTime(); +// primePartitioner.accept(1_000_000); +// long duration = (System.nanoTime() - start) / 1_000_000; +// if (duration < fastest) fastest = duration; +// System.out.println("done in " + duration); +// } +// return fastest; +// } +//} diff --git a/src/main/java/lambdasinaction/chap6/Grouping.java b/src/main/java/lambdasinaction/chap6/Grouping.java index 9105cc80..37aa39a4 100644 --- a/src/main/java/lambdasinaction/chap6/Grouping.java +++ b/src/main/java/lambdasinaction/chap6/Grouping.java @@ -1,96 +1,96 @@ -package lambdasinaction.chap6; - -import java.util.*; - -import static java.util.stream.Collectors.*; -import static lambdasinaction.chap6.Dish.dishTags; -import static lambdasinaction.chap6.Dish.menu; - -public class Grouping { - - enum CaloricLevel { DIET, NORMAL, FAT }; - - public static void main(String ... args) { - System.out.println("Dishes grouped by type: " + groupDishesByType()); - System.out.println("Dish names grouped by type: " + groupDishNamesByType()); - System.out.println("Dish tags grouped by type: " + groupDishTagsByType()); - System.out.println("Caloric dishes grouped by type: " + groupCaloricDishesByType()); - System.out.println("Dishes grouped by caloric level: " + groupDishesByCaloricLevel()); - System.out.println("Dishes grouped by type and caloric level: " + groupDishedByTypeAndCaloricLevel()); - System.out.println("Count dishes in groups: " + countDishesInGroups()); - System.out.println("Most caloric dishes by type: " + mostCaloricDishesByType()); - System.out.println("Most caloric dishes by type: " + mostCaloricDishesByTypeWithoutOprionals()); - System.out.println("Sum calories by type: " + sumCaloriesByType()); - System.out.println("Caloric levels by type: " + caloricLevelsByType()); - } - - private static Map> groupDishesByType() { - return menu.stream().collect(groupingBy(Dish::getType)); - } - - private static Map> groupDishNamesByType() { - return menu.stream().collect(groupingBy(Dish::getType, mapping(Dish::getName, toList()))); - } - - private static Map> groupDishTagsByType() { - return menu.stream().collect(groupingBy(Dish::getType, flatMapping(dish -> dishTags.get( dish.getName() ).stream(), toSet()))); - } - - private static Map> groupCaloricDishesByType() { -// return menu.stream().filter(dish -> dish.getCalories() > 500).collect(groupingBy(Dish::getType)); - return menu.stream().collect(groupingBy(Dish::getType, filtering(dish -> dish.getCalories() > 500, toList()))); - } - - private static Map> groupDishesByCaloricLevel() { - return menu.stream().collect( - groupingBy(dish -> { - if (dish.getCalories() <= 400) return CaloricLevel.DIET; - else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; - else return CaloricLevel.FAT; - } )); - } - - private static Map>> groupDishedByTypeAndCaloricLevel() { - return menu.stream().collect( - groupingBy(Dish::getType, - groupingBy((Dish dish) -> { - if (dish.getCalories() <= 400) return CaloricLevel.DIET; - else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; - else return CaloricLevel.FAT; - } ) - ) - ); - } - - private static Map countDishesInGroups() { - return menu.stream().collect(groupingBy(Dish::getType, counting())); - } - - private static Map> mostCaloricDishesByType() { - return menu.stream().collect( - groupingBy(Dish::getType, - reducing((Dish d1, Dish d2) -> d1.getCalories() > d2.getCalories() ? d1 : d2))); - } - - private static Map mostCaloricDishesByTypeWithoutOprionals() { - return menu.stream().collect( - groupingBy(Dish::getType, - collectingAndThen( - reducing((d1, d2) -> d1.getCalories() > d2.getCalories() ? d1 : d2), - Optional::get))); - } - - private static Map sumCaloriesByType() { - return menu.stream().collect(groupingBy(Dish::getType, - summingInt(Dish::getCalories))); - } - - private static Map> caloricLevelsByType() { - return menu.stream().collect( - groupingBy(Dish::getType, mapping( - dish -> { if (dish.getCalories() <= 400) return CaloricLevel.DIET; - else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; - else return CaloricLevel.FAT; }, - toSet() ))); - } -} +//package lambdasinaction.chap6; +// +//import java.util.*; +// +//import static java.util.stream.Collectors.*; +//import static lambdasinaction.chap6.Dish.dishTags; +//import static lambdasinaction.chap6.Dish.menu; +// +//public class Grouping { +// +// enum CaloricLevel { DIET, NORMAL, FAT }; +// +// public static void main(String ... args) { +// System.out.println("Dishes grouped by type: " + groupDishesByType()); +// System.out.println("Dish names grouped by type: " + groupDishNamesByType()); +// System.out.println("Dish tags grouped by type: " + groupDishTagsByType()); +// System.out.println("Caloric dishes grouped by type: " + groupCaloricDishesByType()); +// System.out.println("Dishes grouped by caloric level: " + groupDishesByCaloricLevel()); +// System.out.println("Dishes grouped by type and caloric level: " + groupDishedByTypeAndCaloricLevel()); +// System.out.println("Count dishes in groups: " + countDishesInGroups()); +// System.out.println("Most caloric dishes by type: " + mostCaloricDishesByType()); +// System.out.println("Most caloric dishes by type: " + mostCaloricDishesByTypeWithoutOprionals()); +// System.out.println("Sum calories by type: " + sumCaloriesByType()); +// System.out.println("Caloric levels by type: " + caloricLevelsByType()); +// } +// +// private static Map> groupDishesByType() { +// return menu.stream().collect(groupingBy(Dish::getType)); +// } +// +// private static Map> groupDishNamesByType() { +// return menu.stream().collect(groupingBy(Dish::getType, mapping(Dish::getName, toList()))); +// } +// +// private static Map> groupDishTagsByType() { +// return menu.stream().collect(groupingBy(Dish::getType, flatMapping(dish -> dishTags.get( dish.getName() ).stream(), toSet()))); +// } +// +// private static Map> groupCaloricDishesByType() { +//// return menu.stream().filter(dish -> dish.getCalories() > 500).collect(groupingBy(Dish::getType)); +// return menu.stream().collect(groupingBy(Dish::getType, filtering(dish -> dish.getCalories() > 500, toList()))); +// } +// +// private static Map> groupDishesByCaloricLevel() { +// return menu.stream().collect( +// groupingBy(dish -> { +// if (dish.getCalories() <= 400) return CaloricLevel.DIET; +// else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; +// else return CaloricLevel.FAT; +// } )); +// } +// +// private static Map>> groupDishedByTypeAndCaloricLevel() { +// return menu.stream().collect( +// groupingBy(Dish::getType, +// groupingBy((Dish dish) -> { +// if (dish.getCalories() <= 400) return CaloricLevel.DIET; +// else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; +// else return CaloricLevel.FAT; +// } ) +// ) +// ); +// } +// +// private static Map countDishesInGroups() { +// return menu.stream().collect(groupingBy(Dish::getType, counting())); +// } +// +// private static Map> mostCaloricDishesByType() { +// return menu.stream().collect( +// groupingBy(Dish::getType, +// reducing((Dish d1, Dish d2) -> d1.getCalories() > d2.getCalories() ? d1 : d2))); +// } +// +// private static Map mostCaloricDishesByTypeWithoutOprionals() { +// return menu.stream().collect( +// groupingBy(Dish::getType, +// collectingAndThen( +// reducing((d1, d2) -> d1.getCalories() > d2.getCalories() ? d1 : d2), +// Optional::get))); +// } +// +// private static Map sumCaloriesByType() { +// return menu.stream().collect(groupingBy(Dish::getType, +// summingInt(Dish::getCalories))); +// } +// +// private static Map> caloricLevelsByType() { +// return menu.stream().collect( +// groupingBy(Dish::getType, mapping( +// dish -> { if (dish.getCalories() <= 400) return CaloricLevel.DIET; +// else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; +// else return CaloricLevel.FAT; }, +// toSet() ))); +// } +//} diff --git a/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java b/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java index 69d7c4ca..04de7674 100644 --- a/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java +++ b/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java @@ -1,106 +1,106 @@ -package lambdasinaction.chap6; - -import java.util.*; -import java.util.function.*; -import java.util.stream.*; - -import static java.util.stream.Collectors.*; -import static java.util.stream.Collector.Characteristics.*; - -public class PartitionPrimeNumbers { - - public static void main(String ... args) { - System.out.println("Numbers partitioned in prime and non-prime: " + partitionPrimes(100)); - System.out.println("Numbers partitioned in prime and non-prime: " + partitionPrimesWithCustomCollector(100)); - - } - - public static Map> partitionPrimes(int n) { - return IntStream.rangeClosed(2, n).boxed() - .collect(partitioningBy(candidate -> isPrime(candidate))); - } - - public static boolean isPrime(int candidate) { - return IntStream.rangeClosed(2, candidate-1) - .limit((long) Math.floor(Math.sqrt((double) candidate)) - 1) - .noneMatch(i -> candidate % i == 0); - } - - public static Map> partitionPrimesWithCustomCollector(int n) { - return IntStream.rangeClosed(2, n).boxed().collect(new PrimeNumbersCollector()); - } - - public static boolean isPrime(List primes, Integer candidate) { - double candidateRoot = Math.sqrt((double) candidate); - //return takeWhile(primes, i -> i <= candidateRoot).stream().noneMatch(i -> candidate % i == 0); - return primes.stream().takeWhile(i -> i <= candidateRoot).noneMatch(i -> candidate % i == 0); - } -/* - public static List takeWhile(List list, Predicate p) { - int i = 0; - for (A item : list) { - if (!p.test(item)) { - return list.subList(0, i); - } - i++; - } - return list; - } -*/ - public static class PrimeNumbersCollector - implements Collector>, Map>> { - - @Override - public Supplier>> supplier() { - return () -> new HashMap>() {{ - put(true, new ArrayList()); - put(false, new ArrayList()); - }}; - } - - @Override - public BiConsumer>, Integer> accumulator() { - return (Map> acc, Integer candidate) -> { - acc.get( isPrime( acc.get(true), - candidate) ) - .add(candidate); - }; - } - - @Override - public BinaryOperator>> combiner() { - return (Map> map1, Map> map2) -> { - map1.get(true).addAll(map2.get(true)); - map1.get(false).addAll(map2.get(false)); - return map1; - }; - } - - @Override - public Function>, Map>> finisher() { - return i -> i; - } - - @Override - public Set characteristics() { - return Collections.unmodifiableSet(EnumSet.of(IDENTITY_FINISH)); - } - } - - public Map> partitionPrimesWithInlineCollector(int n) { - return Stream.iterate(2, i -> i + 1).limit(n) - .collect( - () -> new HashMap>() {{ - put(true, new ArrayList()); - put(false, new ArrayList()); - }}, - (acc, candidate) -> { - acc.get( isPrime(acc.get(true), candidate) ) - .add(candidate); - }, - (map1, map2) -> { - map1.get(true).addAll(map2.get(true)); - map1.get(false).addAll(map2.get(false)); - }); - } -} +//package lambdasinaction.chap6; +// +//import java.util.*; +//import java.util.function.*; +//import java.util.stream.*; +// +//import static java.util.stream.Collectors.*; +//import static java.util.stream.Collector.Characteristics.*; +// +//public class PartitionPrimeNumbers { +// +// public static void main(String ... args) { +// System.out.println("Numbers partitioned in prime and non-prime: " + partitionPrimes(100)); +// System.out.println("Numbers partitioned in prime and non-prime: " + partitionPrimesWithCustomCollector(100)); +// +// } +// +// public static Map> partitionPrimes(int n) { +// return IntStream.rangeClosed(2, n).boxed() +// .collect(partitioningBy(candidate -> isPrime(candidate))); +// } +// +// public static boolean isPrime(int candidate) { +// return IntStream.rangeClosed(2, candidate-1) +// .limit((long) Math.floor(Math.sqrt((double) candidate)) - 1) +// .noneMatch(i -> candidate % i == 0); +// } +// +// public static Map> partitionPrimesWithCustomCollector(int n) { +// return IntStream.rangeClosed(2, n).boxed().collect(new PrimeNumbersCollector()); +// } +// +// public static boolean isPrime(List primes, Integer candidate) { +// double candidateRoot = Math.sqrt((double) candidate); +// //return takeWhile(primes, i -> i <= candidateRoot).stream().noneMatch(i -> candidate % i == 0); +// return primes.stream().takeWhile(i -> i <= candidateRoot).noneMatch(i -> candidate % i == 0); +// } +///* +// public static List takeWhile(List list, Predicate p) { +// int i = 0; +// for (A item : list) { +// if (!p.test(item)) { +// return list.subList(0, i); +// } +// i++; +// } +// return list; +// } +//*/ +// public static class PrimeNumbersCollector +// implements Collector>, Map>> { +// +// @Override +// public Supplier>> supplier() { +// return () -> new HashMap>() {{ +// put(true, new ArrayList()); +// put(false, new ArrayList()); +// }}; +// } +// +// @Override +// public BiConsumer>, Integer> accumulator() { +// return (Map> acc, Integer candidate) -> { +// acc.get( isPrime( acc.get(true), +// candidate) ) +// .add(candidate); +// }; +// } +// +// @Override +// public BinaryOperator>> combiner() { +// return (Map> map1, Map> map2) -> { +// map1.get(true).addAll(map2.get(true)); +// map1.get(false).addAll(map2.get(false)); +// return map1; +// }; +// } +// +// @Override +// public Function>, Map>> finisher() { +// return i -> i; +// } +// +// @Override +// public Set characteristics() { +// return Collections.unmodifiableSet(EnumSet.of(IDENTITY_FINISH)); +// } +// } +// +// public Map> partitionPrimesWithInlineCollector(int n) { +// return Stream.iterate(2, i -> i + 1).limit(n) +// .collect( +// () -> new HashMap>() {{ +// put(true, new ArrayList()); +// put(false, new ArrayList()); +// }}, +// (acc, candidate) -> { +// acc.get( isPrime(acc.get(true), candidate) ) +// .add(candidate); +// }, +// (map1, map2) -> { +// map1.get(true).addAll(map2.get(true)); +// map1.get(false).addAll(map2.get(false)); +// }); +// } +//} diff --git a/src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java b/src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java index 8f74a90a..071f75f5 100644 --- a/src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java +++ b/src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java @@ -1,48 +1,73 @@ package lambdasinaction.chap7; -import java.util.concurrent.RecursiveTask; +import java.util.concurrent.ForkJoinPool; import java.util.concurrent.ForkJoinTask; +import java.util.concurrent.RecursiveTask; import java.util.stream.LongStream; import static lambdasinaction.chap7.ParallelStreamsHarness.FORK_JOIN_POOL; public class ForkJoinSumCalculator extends RecursiveTask { - public static final long THRESHOLD = 10_000; + //이 값 이하의 서브태스크는 더이상 분할할 수 없다. (threshold : 임계치) + public static final long THRESHOLD = 10; - private final long[] numbers; - private final int start; - private final int end; + private final long[] numbers; // 더할 숫자 배열 + private final int start; //이 서브태스크에서 처리할 배열의 초기 위치 + private final int end; //이 서비태스크에서 처리할 배열의 최종 위치 + //메인 태스크를 생성할 때 사용할 공개 생성자 public ForkJoinSumCalculator(long[] numbers) { this(numbers, 0, numbers.length); } + // 메인 태스크의 서브태스크를 재귀적으로 만들때 사용할 비공개 생성자 private ForkJoinSumCalculator(long[] numbers, int start, int end) { this.numbers = numbers; this.start = start; this.end = end; } + /** + * RecursiveTask의 추상 메서드 오버라이드 + * @return + */ @Override protected Long compute() { - int length = end - start; + int length = end - start; // 이 태스크에서 더할 배열의 길이 + + // 기준값과 같거나 작으면 순차적으로 결과를 계산한다. if (length <= THRESHOLD) { return computeSequentially(); } + + // 배열의 첫번째 절반을 더하도록 서브태스크를 생성 ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length/2); - leftTask.fork(); + leftTask.fork(); // ForkJoinPool의 다른 스레드로 새로 생성한 태스크를 비동기로 실행한다. + + //배열의 나머지 절반을 더하도록 서브태스크를 생성 ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length/2, end); - Long rightResult = rightTask.compute(); + Long rightResult = rightTask.compute(); //두 번째 서브태스크를 동기 실행. 이때 추가로 분할이 일어날 수 있음 + + //첫 번째 서브태스크의 결과를 읽거나 아직 결과가 없으면 기다린다. Long leftResult = leftTask.join(); + + //두 서브태스크의 결과를 조합한 값이 이 태스크의 결과다. return leftResult + rightResult; } + /** + * 더 분할할 수 없을 때 서브태스크의 결과를 계산하는 단순 알고리즘 + * @return + */ private long computeSequentially() { long sum = 0; for (int i = start; i < end; i++) { sum += numbers[i]; } + +// long sum = Arrays.stream(numbers, start, end).reduce(0, (a, b) -> a + b); + System.out.println(Thread.currentThread().getName() + ", start=" + start + ", end=" + end + ", sum=" + sum); return sum; } @@ -51,4 +76,13 @@ public static long forkJoinSum(long n) { ForkJoinTask task = new ForkJoinSumCalculator(numbers); return FORK_JOIN_POOL.invoke(task); } + + //테스트를 위한 메인 + public static void main (String[] args) throws Exception { + long[] values = LongStream.rangeClosed(1, 20).toArray(); + ForkJoinTask task = new ForkJoinSumCalculator(values); + long totalSum = new ForkJoinPool().commonPool().invoke(task); + System.out.println("Total sum: " + totalSum); + } + } \ No newline at end of file diff --git a/src/main/java/lambdasinaction/chap7/ParallelStreamsHarness.java b/src/main/java/lambdasinaction/chap7/ParallelStreamsHarness.java index 7d53c86f..c584bb7d 100644 --- a/src/main/java/lambdasinaction/chap7/ParallelStreamsHarness.java +++ b/src/main/java/lambdasinaction/chap7/ParallelStreamsHarness.java @@ -8,14 +8,15 @@ public class ParallelStreamsHarness { public static final ForkJoinPool FORK_JOIN_POOL = new ForkJoinPool(); public static void main(String[] args) { - System.out.println("Iterative Sum done in: " + measurePerf(ParallelStreams::iterativeSum, 10_000_000L) + " msecs"); - System.out.println("Sequential Sum done in: " + measurePerf(ParallelStreams::sequentialSum, 10_000_000L) + " msecs"); - System.out.println("Parallel forkJoinSum done in: " + measurePerf(ParallelStreams::parallelSum, 10_000_000L) + " msecs" ); - System.out.println("Range forkJoinSum done in: " + measurePerf(ParallelStreams::rangedSum, 10_000_000L) + " msecs"); - System.out.println("Parallel range forkJoinSum done in: " + measurePerf(ParallelStreams::parallelRangedSum, 10_000_000L) + " msecs" ); - System.out.println("ForkJoin sum done in: " + measurePerf(ForkJoinSumCalculator::forkJoinSum, 10_000_000L) + " msecs" ); - System.out.println("SideEffect sum done in: " + measurePerf(ParallelStreams::sideEffectSum, 10_000_000L) + " msecs" ); - System.out.println("SideEffect prallel sum done in: " + measurePerf(ParallelStreams::sideEffectParallelSum, 10_000_000L) + " msecs" ); +// System.out.println("Iterative Sum done in: " + measurePerf(ParallelStreams::iterativeSum, 10_000_000L) + " msecs"); +// System.out.println("Sequential Sum done in: " + measurePerf(ParallelStreams::sequentialSum, 10_000_000L) + " msecs"); +// System.out.println("Parallel forkJoinSum done in: " + measurePerf(ParallelStreams::parallelSum, 10_000_000L) + " msecs" ); +// System.out.println("Range forkJoinSum done in: " + measurePerf(ParallelStreams::rangedSum, 10_000_000L) + " msecs"); +// System.out.println("Parallel range forkJoinSum done in: " + measurePerf(ParallelStreams::parallelRangedSum, 10_000_000L) + " msecs" ); + System.out.println("ForkJoin sum done in: " + measurePerf(ForkJoinSumCalculator::forkJoinSum, 80L) + " msecs" ); +// System.out.println("ForkJoin sum done in: " + measurePerf(ForkJoinSumCalculator::forkJoinSum, 10_000_000L) + " msecs" ); +// System.out.println("SideEffect sum done in: " + measurePerf(ParallelStreams::sideEffectSum, 10_000_000L) + " msecs" ); +// System.out.println("SideEffect prallel sum done in: " + measurePerf(ParallelStreams::sideEffectParallelSum, 10_000_000L) + " msecs" ); } public static long measurePerf(Function f, T input) {