From 7847feb72de3d4b7ba5ee2763323f985369f602c Mon Sep 17 00:00:00 2001 From: zhoujianjun Date: Fri, 10 Apr 2020 14:58:17 +0800 Subject: [PATCH 1/5] =?UTF-8?q?1=E3=80=81add=20DIY=20docs=20and=20demos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chap10/OperationsWithOptional.java | 10 +- .../lambdasinaction/chap10/OptionalMain.java | 14 +- .../java/lambdasinaction/chap3/Lambdas.java | 3 +- .../java/lambdasinaction/chap3/Sorting.java | 10 +- .../lambdasinaction/chap4/StreamBasic.java | 52 +++++-- .../chap5/BuildingStreams.java | 15 +- .../java/lambdasinaction/chap5/Filtering.java | 27 ++-- .../java/lambdasinaction/chap5/Laziness.java | 25 ++-- .../lambdasinaction/chap5/NumericStreams.java | 50 +++---- .../chap5/PuttingIntoPractice.java | 129 ++++++++---------- .../java/lambdasinaction/chap5/Reducing.java | 11 +- .../chap6/CollectorHarness.java | 1 + .../java/lambdasinaction/chap6/Grouping.java | 46 +++++-- .../chap6/GroupingTransactions.java | 46 +++---- .../chap6/PartitionPrimeNumbers.java | 5 +- .../lambdasinaction/chap6/Summarizing.java | 1 + 16 files changed, 248 insertions(+), 197 deletions(-) diff --git a/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java b/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java index d2940969..ca01642c 100644 --- a/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java +++ b/src/main/java/lambdasinaction/chap10/OperationsWithOptional.java @@ -12,11 +12,11 @@ public static void main(String... args) { 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)) - ); + // Optional opt2 = opt1.or(() -> of(4)); + // + // System.out.println( + // of(5).or(() -> of(4)) + // ); } public static final Optional max(Optional i, Optional j) { diff --git a/src/main/java/lambdasinaction/chap10/OptionalMain.java b/src/main/java/lambdasinaction/chap10/OptionalMain.java index dcd97792..007de444 100644 --- a/src/main/java/lambdasinaction/chap10/OptionalMain.java +++ b/src/main/java/lambdasinaction/chap10/OptionalMain.java @@ -14,11 +14,13 @@ public String getCarInsuranceName(Optional person) { } 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()); + // return persons.stream() + // .map(Person::getCar) + // .map(optCar -> optCar.flatMap(Car::getInsurance)) + // .map(optInsurance -> optInsurance.map(Insurance::getName)) + // .flatMap(Optional::stream) + // .collect(toSet()); + + return null; } } diff --git a/src/main/java/lambdasinaction/chap3/Lambdas.java b/src/main/java/lambdasinaction/chap3/Lambdas.java index 697f340e..486e4e20 100644 --- a/src/main/java/lambdasinaction/chap3/Lambdas.java +++ b/src/main/java/lambdasinaction/chap3/Lambdas.java @@ -17,7 +17,8 @@ public static void main(String ...args){ System.out.println(greenApples); - Comparator c = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()); + // Comparator c = (Apple a1, Apple a2) -> a1.getWeight().compareTo(a2.getWeight()); + Comparator c = Comparator.comparing(Apple::getWeight); // [Apple{color='green', weight=80}, Apple{color='red', weight=120}, Apple{color='green', weight=155}] inventory.sort(c); diff --git a/src/main/java/lambdasinaction/chap3/Sorting.java b/src/main/java/lambdasinaction/chap3/Sorting.java index 41acbe25..72009827 100644 --- a/src/main/java/lambdasinaction/chap3/Sorting.java +++ b/src/main/java/lambdasinaction/chap3/Sorting.java @@ -20,10 +20,12 @@ public static void main(String...args){ // 2 // [Apple{color='green', weight=30}, Apple{color='green', weight=80}, Apple{color='green', weight=155}] - inventory.sort(new Comparator() { - public int compare(Apple a1, Apple a2){ - return a1.getWeight().compareTo(a2.getWeight()); - }}); + // inventory.sort(new Comparator() { + // public int compare(Apple a1, Apple a2){ + // return a1.getWeight().compareTo(a2.getWeight()); + // }}); + + inventory.sort(Comparator.comparing(Apple::getWeight)); System.out.println(inventory); // reshuffling things a little diff --git a/src/main/java/lambdasinaction/chap4/StreamBasic.java b/src/main/java/lambdasinaction/chap4/StreamBasic.java index 19a8c176..47f7eed1 100644 --- a/src/main/java/lambdasinaction/chap4/StreamBasic.java +++ b/src/main/java/lambdasinaction/chap4/StreamBasic.java @@ -1,46 +1,78 @@ package lambdasinaction.chap4; import java.util.*; -import java.util.stream.*; import static java.util.Comparator.comparing; import static java.util.stream.Collectors.toList; -import static lambdasinaction.chap4.Dish.menu; - public class StreamBasic { - public static void main(String...args){ + public static void main(String... args) { // Java 7 getLowCaloricDishesNamesInJava7(Dish.menu).forEach(System.out::println); System.out.println("---"); + getLowCaloricDishesNamesInJava8(Dish.menu, + new DishCaloricPredicate(), + Comparator.comparing(Dish::getCalories)).forEach(System.out::println); + + System.out.println("---"); + // Java 8 getLowCaloricDishesNamesInJava8(Dish.menu).forEach(System.out::println); } - public static List getLowCaloricDishesNamesInJava7(List dishes){ + public static List getLowCaloricDishesNamesInJava7(List dishes) { List lowCaloricDishes = new ArrayList<>(); - for(Dish d: dishes){ - if(d.getCalories() < 400){ + for (Dish d : dishes) { + if (d.getCalories() < 400) { lowCaloricDishes.add(d); } } List lowCaloricDishesName = new ArrayList<>(); Collections.sort(lowCaloricDishes, new Comparator() { - public int compare(Dish d1, Dish d2){ + public int compare(Dish d1, Dish d2) { return Integer.compare(d1.getCalories(), d2.getCalories()); } }); - for(Dish d: lowCaloricDishes){ + for (Dish d : lowCaloricDishes) { lowCaloricDishesName.add(d.getName()); } return lowCaloricDishesName; } - public static List getLowCaloricDishesNamesInJava8(List dishes){ + /** + * add by aaron 2020-04-07 10:21:02 + * + * @param dishes + * @param predicate + * @param comparator + * @return + */ + public static List getLowCaloricDishesNamesInJava8(List dishes, + DishCaloricPredicate predicate, + Comparator comparator) { + return dishes.stream() + .filter(d -> predicate.filter(d)) + .sorted(comparator) + .map(Dish::getName) + .collect(toList()); + } + + interface DishPredicate { + boolean filter(Dish d); + } + + static class DishCaloricPredicate implements DishPredicate { + @Override + public boolean filter(Dish d) { + return d.getCalories() < 400; + } + } + + public static List getLowCaloricDishesNamesInJava8(List dishes) { return dishes.stream() .filter(d -> d.getCalories() < 400) .sorted(comparing(Dish::getCalories)) diff --git a/src/main/java/lambdasinaction/chap5/BuildingStreams.java b/src/main/java/lambdasinaction/chap5/BuildingStreams.java index 15280a39..7bc912e0 100644 --- a/src/main/java/lambdasinaction/chap5/BuildingStreams.java +++ b/src/main/java/lambdasinaction/chap5/BuildingStreams.java @@ -23,7 +23,7 @@ public static void main(String...args) throws Exception{ // Stream.iterate Stream.iterate(0, n -> n + 2) - .limit(10) + .limit(10) // 限制数字个数,而非值的大小 .forEach(System.out::println); // fibonnaci with iterate @@ -66,12 +66,13 @@ public int getAsInt(){ }; IntStream.generate(fib).limit(10).forEach(System.out::println); - long uniqueWords = Files.lines(Paths.get("lambdasinaction/chap5/data.txt"), Charset.defaultCharset()) - .flatMap(line -> Arrays.stream(line.split(" "))) - .distinct() - .count(); - - System.out.println("There are " + uniqueWords + " unique words in data.txt"); + // delete by aaron because the txt is not exists 2020-04-07 11:08:27 + // long uniqueWords = Files.lines(Paths.get("lambdasinaction/chap5/data.txt"), Charset.defaultCharset()) + // .flatMap(line -> Arrays.stream(line.split(" "))) + // .distinct() + // .count(); + // + // System.out.println("There are " + uniqueWords + " unique words in data.txt"); } diff --git a/src/main/java/lambdasinaction/chap5/Filtering.java b/src/main/java/lambdasinaction/chap5/Filtering.java index 066c8242..448a64bd 100644 --- a/src/main/java/lambdasinaction/chap5/Filtering.java +++ b/src/main/java/lambdasinaction/chap5/Filtering.java @@ -1,43 +1,46 @@ package lambdasinaction.chap5; + import lambdasinaction.chap4.*; import java.util.stream.*; import java.util.*; + import static java.util.stream.Collectors.toList; import static lambdasinaction.chap4.Dish.menu; -public class Filtering{ +public class Filtering { - public static void main(String...args){ + public static void main(String... args) { // Filtering with predicate List vegetarianMenu = - menu.stream() - .filter(Dish::isVegetarian) - .collect(toList()); + menu.stream() + .filter(Dish::isVegetarian) + .collect(toList()); vegetarianMenu.forEach(System.out::println); // Filtering unique elements List numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4); numbers.stream() - .filter(i -> i % 2 == 0) - .distinct() - .forEach(System.out::println); + .filter(i -> i % 2 == 0) + .distinct() + .forEach(System.out::println); // Truncating a stream - List dishesLimit3 = - menu.stream() + List dishesLimit3 = menu.stream() .filter(d -> d.getCalories() > 300) + // add by aaron add sort and reverse 2020-04-07 11:36:00 start + .sorted(Comparator.comparing(Dish::getCalories).reversed()) + // add by aaron add sort and reverse 2020-04-07 11:36:00 end .limit(3) .collect(toList()); dishesLimit3.forEach(System.out::println); // Skipping elements - List dishesSkip2 = - menu.stream() + List dishesSkip2 = menu.stream() .filter(d -> d.getCalories() > 300) .skip(2) .collect(toList()); diff --git a/src/main/java/lambdasinaction/chap5/Laziness.java b/src/main/java/lambdasinaction/chap5/Laziness.java index a3df328a..a7a34675 100644 --- a/src/main/java/lambdasinaction/chap5/Laziness.java +++ b/src/main/java/lambdasinaction/chap5/Laziness.java @@ -12,19 +12,18 @@ public class Laziness { public static void main(String[] args) { List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8); - List twoEvenSquares = - numbers.stream() - .filter(n -> { - System.out.println("filtering " + n); return n % 2 == 0; - }) - .map(n -> { - System.out.println("mapping " + n); - return n * n; - }) - .limit(2) - .collect(toList()); + List twoEvenSquares = numbers.stream() + .filter(n -> { + System.out.println("filtering " + n); + return n % 2 == 0; + }) + .map(n -> { + System.out.println("mapping " + n); + return n * n; + }) + .limit(2) + .collect(toList()); + System.out.println(twoEvenSquares); } - - } diff --git a/src/main/java/lambdasinaction/chap5/NumericStreams.java b/src/main/java/lambdasinaction/chap5/NumericStreams.java index e5f8cca8..55d869ef 100644 --- a/src/main/java/lambdasinaction/chap5/NumericStreams.java +++ b/src/main/java/lambdasinaction/chap5/NumericStreams.java @@ -1,4 +1,5 @@ package lambdasinaction.chap5; + import lambdasinaction.chap4.*; import java.util.stream.*; @@ -6,52 +7,51 @@ import static lambdasinaction.chap4.Dish.menu; -public class NumericStreams{ +public class NumericStreams { + + public static void main(String... args) { - public static void main(String...args){ - - List numbers = Arrays.asList(3,4,5,1,2); + List numbers = Arrays.asList(3, 4, 5, 1, 2); Arrays.stream(numbers.toArray()).forEach(System.out::println); int calories = menu.stream() - .mapToInt(Dish::getCalories) - .sum(); + .mapToInt(Dish::getCalories) + .sum(); System.out.println("Number of calories:" + calories); // max and OptionalInt - OptionalInt maxCalories = menu.stream() - .mapToInt(Dish::getCalories) - .max(); + OptionalInt maxCalories = menu.stream() + .mapToInt(Dish::getCalories) + .max(); int max; - if(maxCalories.isPresent()){ + + if (maxCalories.isPresent()) { max = maxCalories.getAsInt(); - } - else { + } else { // we can choose a default value max = 1; } - System.out.println(max); + System.out.println("max:" + max); // numeric ranges IntStream evenNumbers = IntStream.rangeClosed(1, 100) - .filter(n -> n % 2 == 0); + .filter(n -> n % 2 == 0); - System.out.println(evenNumbers.count()); + System.out.println("evenNumbers:" + evenNumbers.count()); - Stream pythagoreanTriples = - IntStream.rangeClosed(1, 100).boxed() - .flatMap(a -> IntStream.rangeClosed(a, 100) - .filter(b -> Math.sqrt(a*a + b*b) % 1 == 0).boxed() - .map(b -> new int[]{a, b, (int) Math.sqrt(a * a + b * b)})); + // 求出来100以内能够组成整数平方数:a平方+b平方=c平方 c为整数。 + Stream pythagoreanTriples = IntStream.rangeClosed(1, 100).boxed() + .flatMap(a -> IntStream.rangeClosed(a, 100) + .filter(b -> Math.sqrt(a * a + b * b) % 1 == 0).boxed() + .map(b -> new int[]{a, b, (int) Math.sqrt(a * a + b * b)})); - pythagoreanTriples.forEach(t -> System.out.println(t[0] + ", " + t[1] + ", " + t[2])); + pythagoreanTriples.forEach(t -> System.out.println(t[0] + ", " + t[1] + ", " + t[2])); } - - public static boolean isPerfectSquare(int n){ + + public static boolean isPerfectSquare(int n) { return Math.sqrt(n) % 1 == 0; } - -} +} \ No newline at end of file diff --git a/src/main/java/lambdasinaction/chap5/PuttingIntoPractice.java b/src/main/java/lambdasinaction/chap5/PuttingIntoPractice.java index d0b13ae5..e4fa5af1 100644 --- a/src/main/java/lambdasinaction/chap5/PuttingIntoPractice.java +++ b/src/main/java/lambdasinaction/chap5/PuttingIntoPractice.java @@ -1,90 +1,77 @@ package lambdasinaction.chap5; -import lambdasinaction.chap5.*; - -import java.util.*; +import java.util.Arrays; +import java.util.List; import static java.util.Comparator.comparing; import static java.util.stream.Collectors.toList; -public class PuttingIntoPractice{ - public static void main(String ...args){ +public class PuttingIntoPractice { + public static void main(String... args) { Trader raoul = new Trader("Raoul", "Cambridge"); - Trader mario = new Trader("Mario","Milan"); - Trader alan = new Trader("Alan","Cambridge"); - Trader brian = new Trader("Brian","Cambridge"); - - List transactions = Arrays.asList( - new Transaction(brian, 2011, 300), - new Transaction(raoul, 2012, 1000), - new Transaction(raoul, 2011, 400), - new Transaction(mario, 2012, 710), - new Transaction(mario, 2012, 700), - new Transaction(alan, 2012, 950) - ); - - + Trader mario = new Trader("Mario", "Milan"); + Trader alan = new Trader("Alan", "Cambridge"); + Trader brian = new Trader("Brian", "Cambridge"); + + List transactions = Arrays.asList( + new Transaction(brian, 2011, 300), + new Transaction(raoul, 2012, 1000), + new Transaction(raoul, 2011, 400), + new Transaction(mario, 2012, 710), + new Transaction(mario, 2012, 700), + new Transaction(alan, 2012, 950) + ); + // Query 1: Find all transactions from year 2011 and sort them by value (small to high). List tr2011 = transactions.stream() - .filter(transaction -> transaction.getYear() == 2011) - .sorted(comparing(Transaction::getValue)) - .collect(toList()); - System.out.println(tr2011); - + .filter(transaction -> transaction.getYear() == 2011) + .sorted(comparing(Transaction::getValue).reversed()) + .collect(toList()); + System.out.println("tr2011:" + tr2011); + // Query 2: What are all the unique cities where the traders work? - List cities = - transactions.stream() - .map(transaction -> transaction.getTrader().getCity()) - .distinct() - .collect(toList()); - System.out.println(cities); + List cities = transactions.stream() + .map(transaction -> transaction.getTrader().getCity()) + .distinct() + .collect(toList()); + System.out.println("cities:" + cities); // Query 3: Find all traders from Cambridge and sort them by name. - - List traders = - transactions.stream() - .map(Transaction::getTrader) - .filter(trader -> trader.getCity().equals("Cambridge")) - .distinct() - .sorted(comparing(Trader::getName)) - .collect(toList()); - System.out.println(traders); - - + List traders = transactions.stream() + .map(Transaction::getTrader) + .filter(trader -> trader.getCity().equals("Cambridge")) + .distinct() + .sorted(comparing(Trader::getName)) + .collect(toList()); + System.out.println("traders:" + traders); + // Query 4: Return a string of all traders’ names sorted alphabetically. - - String traderStr = - transactions.stream() - .map(transaction -> transaction.getTrader().getName()) - .distinct() - .sorted() - .reduce("", (n1, n2) -> n1 + n2); - System.out.println(traderStr); - + String traderStr = transactions.stream() + .map(transaction -> transaction.getTrader().getName()) + .distinct() + .sorted() + .reduce("1", (n1, n2) -> n1 + "_" + n2); // TODO reduce的key是什么值? + System.out.println("traderStr:" + traderStr); + // Query 5: Are there any trader based in Milan? - - boolean milanBased = - transactions.stream() - .anyMatch(transaction -> transaction.getTrader() - .getCity() - .equals("Milan") - ); - System.out.println(milanBased); - - + boolean milanBased = transactions.stream() + .anyMatch(transaction -> transaction.getTrader() + .getCity() + .equals("Milan") + ); + System.out.println("milanBased:" + milanBased); + // Query 6: Update all transactions so that the traders from Milan are set to Cambridge. transactions.stream() - .map(Transaction::getTrader) - .filter(trader -> trader.getCity().equals("Milan")) - .forEach(trader -> trader.setCity("Cambridge")); - System.out.println(transactions); - - + .map(Transaction::getTrader) + .filter(trader -> trader.getCity().equals("Milan")) + .forEach(trader -> trader.setCity("Cambridge")); + System.out.println("transactions:" + transactions); + // Query 7: What's the highest value in all the transactions? - int highestValue = - transactions.stream() - .map(Transaction::getValue) - .reduce(0, Integer::max); - System.out.println(highestValue); + int highestValue = transactions.stream() + .map(Transaction::getValue) + .reduce(0, Integer::max); + System.out.println("highestValue:" + highestValue); } } \ No newline at end of file diff --git a/src/main/java/lambdasinaction/chap5/Reducing.java b/src/main/java/lambdasinaction/chap5/Reducing.java index 93aed73e..101b3e54 100644 --- a/src/main/java/lambdasinaction/chap5/Reducing.java +++ b/src/main/java/lambdasinaction/chap5/Reducing.java @@ -1,4 +1,5 @@ package lambdasinaction.chap5; + import lambdasinaction.chap4.*; import java.util.stream.*; @@ -6,11 +7,11 @@ import static lambdasinaction.chap4.Dish.menu; -public class Reducing{ +public class Reducing { - public static void main(String...args){ + public static void main(String... args) { - List numbers = Arrays.asList(3,4,5,1,2); + List numbers = Arrays.asList(3, 4, 5, 1, 2); int sum = numbers.stream().reduce(0, (a, b) -> a + b); System.out.println(sum); @@ -24,8 +25,8 @@ public static void main(String...args){ min.ifPresent(System.out::println); int calories = menu.stream() - .map(Dish::getCalories) - .reduce(0, Integer::sum); + .map(Dish::getCalories) + .reduce(0, Integer::sum); System.out.println("Number of calories:" + calories); } } diff --git a/src/main/java/lambdasinaction/chap6/CollectorHarness.java b/src/main/java/lambdasinaction/chap6/CollectorHarness.java index 8370be16..4b04e180 100644 --- a/src/main/java/lambdasinaction/chap6/CollectorHarness.java +++ b/src/main/java/lambdasinaction/chap6/CollectorHarness.java @@ -9,6 +9,7 @@ public static void main(String[] args) { System.out.println("Partitioning done in: " + execute(PartitionPrimeNumbers::partitionPrimesWithCustomCollector) + " msecs" ); } + // TODO 做了什么? private static long execute(Consumer primePartitioner) { long fastest = Long.MAX_VALUE; for (int i = 0; i < 10; i++) { diff --git a/src/main/java/lambdasinaction/chap6/Grouping.java b/src/main/java/lambdasinaction/chap6/Grouping.java index 9105cc80..95718570 100644 --- a/src/main/java/lambdasinaction/chap6/Grouping.java +++ b/src/main/java/lambdasinaction/chap6/Grouping.java @@ -1,16 +1,22 @@ package lambdasinaction.chap6; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; import static java.util.stream.Collectors.*; -import static lambdasinaction.chap6.Dish.dishTags; import static lambdasinaction.chap6.Dish.menu; +/** + * aaron perfect + * doc by aaron 2020-04-10 14:52:59 + */ public class Grouping { - enum CaloricLevel { DIET, NORMAL, FAT }; + enum CaloricLevel {DIET, NORMAL, FAT} - public static void main(String ... args) { + 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()); @@ -21,6 +27,7 @@ public static void main(String ... args) { 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("average calories by type: " + averageCaloriesByType()); System.out.println("Caloric levels by type: " + caloricLevelsByType()); } @@ -29,16 +36,21 @@ private static Map> groupDishesByType() { } 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()))); + // flatMapping 不是静态方法 + // return menu.stream().collect(groupingBy(Dish::getType, flatMapping(dish -> dishTags.get( dish.getName() ).stream(), toSet()))); + return menu.stream().collect(groupingBy(Dish::getType, mapping(Dish::getName, 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()))); + return menu.stream().filter(dish -> dish.getCalories() > 500).collect(groupingBy(Dish::getType, mapping(dish -> dish, toList()))); + + // filtering 在1.8中不是静态方法 +// return menu.stream().collect(groupingBy(Dish::getType, filtering(dish -> dish.getCalories() > 500, toList()))); } private static Map> groupDishesByCaloricLevel() { @@ -47,7 +59,7 @@ private static Map> groupDishesByCaloricLevel() { if (dish.getCalories() <= 400) return CaloricLevel.DIET; else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; else return CaloricLevel.FAT; - } )); + })); } private static Map>> groupDishedByTypeAndCaloricLevel() { @@ -57,7 +69,7 @@ private static Map>> groupDishedByTypeAn if (dish.getCalories() <= 400) return CaloricLevel.DIET; else if (dish.getCalories() <= 700) return CaloricLevel.NORMAL; else return CaloricLevel.FAT; - } ) + }) ) ); } @@ -85,12 +97,20 @@ private static Map sumCaloriesByType() { summingInt(Dish::getCalories))); } + // add by aaron 2020-04-10 14:24:05 + private static Map averageCaloriesByType() { + return menu.stream().collect(groupingBy(Dish::getType, + averagingDouble(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() ))); + 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/GroupingTransactions.java b/src/main/java/lambdasinaction/chap6/GroupingTransactions.java index ce358acb..f3fb4785 100644 --- a/src/main/java/lambdasinaction/chap6/GroupingTransactions.java +++ b/src/main/java/lambdasinaction/chap6/GroupingTransactions.java @@ -6,19 +6,19 @@ public class GroupingTransactions { - public static List transactions = Arrays.asList( new Transaction(Currency.EUR, 1500.0), - new Transaction(Currency.USD, 2300.0), - new Transaction(Currency.GBP, 9900.0), - new Transaction(Currency.EUR, 1100.0), - new Transaction(Currency.JPY, 7800.0), - new Transaction(Currency.CHF, 6700.0), - new Transaction(Currency.EUR, 5600.0), - new Transaction(Currency.USD, 4500.0), - new Transaction(Currency.CHF, 3400.0), - new Transaction(Currency.GBP, 3200.0), - new Transaction(Currency.USD, 4600.0), - new Transaction(Currency.JPY, 5700.0), - new Transaction(Currency.EUR, 6800.0) ); + public static List transactions = Arrays.asList( new Transaction(CurrencyEnum.EUR, 1500.0), + new Transaction(CurrencyEnum.USD, 2300.0), + new Transaction(CurrencyEnum.GBP, 9900.0), + new Transaction(CurrencyEnum.EUR, 1100.0), + new Transaction(CurrencyEnum.JPY, 7800.0), + new Transaction(CurrencyEnum.CHF, 6700.0), + new Transaction(CurrencyEnum.EUR, 5600.0), + new Transaction(CurrencyEnum.USD, 4500.0), + new Transaction(CurrencyEnum.CHF, 3400.0), + new Transaction(CurrencyEnum.GBP, 3200.0), + new Transaction(CurrencyEnum.USD, 4600.0), + new Transaction(CurrencyEnum.JPY, 5700.0), + new Transaction(CurrencyEnum.EUR, 6800.0) ); public static void main(String ... args) { groupImperatively(); groupFunctionally(); @@ -26,9 +26,9 @@ public static void main(String ... args) { } private static void groupImperatively() { - Map> transactionsByCurrencies = new HashMap<>(); + Map> transactionsByCurrencies = new HashMap<>(); for (Transaction transaction : transactions) { - Currency currency = transaction.getCurrency(); + CurrencyEnum currency = transaction.getCurrencyEnum(); List transactionsForCurrency = transactionsByCurrencies.get(currency); if (transactionsForCurrency == null) { transactionsForCurrency = new ArrayList<>(); @@ -41,21 +41,21 @@ private static void groupImperatively() { } private static void groupFunctionally() { - Map> transactionsByCurrencies = transactions.stream().collect(groupingBy(Transaction::getCurrency)); + Map> transactionsByCurrencies = transactions.stream().collect(groupingBy(Transaction::getCurrencyEnum)); System.out.println(transactionsByCurrencies); } public static class Transaction { - private final Currency currency; + private final CurrencyEnum currencyEnum; private final double value; - public Transaction(Currency currency, double value) { - this.currency = currency; + public Transaction(CurrencyEnum currency, double value) { + this.currencyEnum = currency; this.value = value; } - public Currency getCurrency() { - return currency; + public CurrencyEnum getCurrencyEnum() { + return currencyEnum; } public double getValue() { @@ -64,11 +64,11 @@ public double getValue() { @Override public String toString() { - return currency + " " + value; + return currencyEnum + " " + value; } } - public enum Currency { + public enum CurrencyEnum { EUR, USD, JPY, GBP, CHF } } diff --git a/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java b/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java index 69d7c4ca..3aeae8b3 100644 --- a/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java +++ b/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java @@ -33,13 +33,14 @@ public static Map> partitionPrimesWithCustomCollector(int 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); + // return primes.stream().takeWhile(i -> i <= candidateRoot).noneMatch(i -> candidate % i == 0); + return false; } /* public static List takeWhile(List list, Predicate p) { int i = 0; for (A item : list) { - if (!p.test(item)) { + if (!p.filter(item)) { return list.subList(0, i); } i++; diff --git a/src/main/java/lambdasinaction/chap6/Summarizing.java b/src/main/java/lambdasinaction/chap6/Summarizing.java index 06f9af6d..6446b20e 100644 --- a/src/main/java/lambdasinaction/chap6/Summarizing.java +++ b/src/main/java/lambdasinaction/chap6/Summarizing.java @@ -42,6 +42,7 @@ private static Double calculateAverageCalories() { return menu.stream().collect(averagingInt(Dish::getCalories)); } + // 强! private static IntSummaryStatistics calculateMenuStatistics() { return menu.stream().collect(summarizingInt(Dish::getCalories)); } From c5d7efad8743fe0fce9966efa1842508141d2b16 Mon Sep 17 00:00:00 2001 From: zhoujianjun Date: Mon, 13 Apr 2020 17:58:27 +0800 Subject: [PATCH 2/5] =?UTF-8?q?1=E3=80=81add=20map=20and=20flatMapping=20d?= =?UTF-8?q?iff?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chap5/MappingAndFlatMapping.java | 63 +++++++++++++++++++ .../chap7/ForkJoinSumCalculator.java | 6 +- .../chap7/ParallelStreamsHarness.java | 17 +++-- .../java/lambdasinaction/chap7/WordCount.java | 1 + .../java/lambdasinaction/chap8/Debugging.java | 6 +- .../lambdasinaction/chap8/FactoryMain.java | 5 +- .../lambdasinaction/chap8/ObserverMain.java | 1 - 7 files changed, 85 insertions(+), 14 deletions(-) create mode 100644 src/main/java/lambdasinaction/chap5/MappingAndFlatMapping.java diff --git a/src/main/java/lambdasinaction/chap5/MappingAndFlatMapping.java b/src/main/java/lambdasinaction/chap5/MappingAndFlatMapping.java new file mode 100644 index 00000000..51d15bea --- /dev/null +++ b/src/main/java/lambdasinaction/chap5/MappingAndFlatMapping.java @@ -0,0 +1,63 @@ +package lambdasinaction.chap5; + +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +/** + * @author : zhoujianjun + * @version V1.0 + * @Project: Java8InAction + * @Package lambdasinaction.chap7 + * @Description: + * 题目:给定两个数字列表,如何返回所有的数对呢?例如,给定列表[1, 2, 3]和列表[3, 4],应 + * 该返回[(1, 3), (1, 4), (2, 3), (2, 4), (3, 3), (3, 4)]。为简单起见,你可以用有两个元素的数组来代 + * 表数对。 + * + * FAQ:map 与 flatmap的区别: + * 相同点:map和flatmap处理后的数据都是Stream类型 + * 不同点:map处理后数据会成为一个Stream集合即List>,而flatMap处理后的对象还是一个Stream对象。 + * 参考foreach过程。 + * @date Date : 2020年04月10日 17:08 + */ +public class MappingAndFlatMapping { + public static void main(String[] args) { + + // map 与 flatmap的区别 + Arrays.asList(1, 2, 3).stream().map(n -> { + return Arrays.asList(3, 4).stream().map(m -> { + return new int[]{n, m}; + }); + }).forEach(pairStream -> { + // pair-> Stream + pairStream.forEach(pair -> { + System.out.println("(" + pair[0] + ", " + pair[1] + ")"); + }); + }); + + System.out.println("---------------"); + + Arrays.asList(1, 2, 3).stream().flatMap(n -> { + return Arrays.asList(3, 4).stream().map(m -> { + return new int[]{n, m}; + }); + }).forEach(pair -> { + // pair->R + System.out.println("(" + pair[0] + ", " + pair[1] + ")"); + }); + + // + List> listStream = Arrays.asList(1, 2, 3).stream().map(n -> { + return Arrays.asList(3, 4).stream().map(m -> { + return new int[]{n, m}; + }); + }).collect(Collectors.toList()); + + List list = Arrays.asList(1, 2, 3).stream().flatMap(n -> { + return Arrays.asList(3, 4).stream().map(m -> { + return new int[]{n, m}; + }); + }).collect(Collectors.toList()); + } +} \ No newline at end of file diff --git a/src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java b/src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java index 8f74a90a..85980d81 100644 --- a/src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java +++ b/src/main/java/lambdasinaction/chap7/ForkJoinSumCalculator.java @@ -30,11 +30,13 @@ protected Long compute() { if (length <= THRESHOLD) { return computeSequentially(); } - ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length/2); + ForkJoinSumCalculator leftTask = new ForkJoinSumCalculator(numbers, start, start + length / 2); leftTask.fork(); - ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length/2, end); + ForkJoinSumCalculator rightTask = new ForkJoinSumCalculator(numbers, start + length / 2, end); Long rightResult = rightTask.compute(); + System.out.println("(" + start + "," + end + ")" + "=" + rightResult); Long leftResult = leftTask.join(); + System.out.println("(" + start + "," + end + ")" + "=" + leftResult); return leftResult + rightResult; } diff --git a/src/main/java/lambdasinaction/chap7/ParallelStreamsHarness.java b/src/main/java/lambdasinaction/chap7/ParallelStreamsHarness.java index 7d53c86f..9391ff28 100644 --- a/src/main/java/lambdasinaction/chap7/ParallelStreamsHarness.java +++ b/src/main/java/lambdasinaction/chap7/ParallelStreamsHarness.java @@ -10,23 +10,28 @@ public class ParallelStreamsHarness { 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("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("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"); } public static long measurePerf(Function f, T input) { long fastest = Long.MAX_VALUE; + long sum = 0; for (int i = 0; i < 10; i++) { long start = System.nanoTime(); R result = f.apply(input); long duration = (System.nanoTime() - start) / 1_000_000; - System.out.println("Result: " + result); + + sum += duration; + System.out.println("Result: " + result + " msecs"); if (duration < fastest) fastest = duration; } + + System.out.println("total time :" + sum); return fastest; } } diff --git a/src/main/java/lambdasinaction/chap7/WordCount.java b/src/main/java/lambdasinaction/chap7/WordCount.java index 13ccce52..5cf0fc26 100644 --- a/src/main/java/lambdasinaction/chap7/WordCount.java +++ b/src/main/java/lambdasinaction/chap7/WordCount.java @@ -13,6 +13,7 @@ public class WordCount { public static void main(String[] args) { System.out.println("Found " + countWordsIteratively(SENTENCE) + " words"); + // TODO read more System.out.println("Found " + countWords(SENTENCE) + " words"); } diff --git a/src/main/java/lambdasinaction/chap8/Debugging.java b/src/main/java/lambdasinaction/chap8/Debugging.java index 40c4dd23..b7d943d5 100644 --- a/src/main/java/lambdasinaction/chap8/Debugging.java +++ b/src/main/java/lambdasinaction/chap8/Debugging.java @@ -3,14 +3,14 @@ import java.util.*; -public class Debugging{ +public class Debugging { public static void main(String[] args) { List points = Arrays.asList(new Point(12, 2), null); - points.stream().map(p -> p.getX()).forEach(System.out::println); + points.stream().filter(p -> p != null).map(p -> p.getX()).forEach(System.out::println); } - private static class Point{ + private static class Point { private int x; private int y; diff --git a/src/main/java/lambdasinaction/chap8/FactoryMain.java b/src/main/java/lambdasinaction/chap8/FactoryMain.java index e30d219e..3c3e7c9b 100644 --- a/src/main/java/lambdasinaction/chap8/FactoryMain.java +++ b/src/main/java/lambdasinaction/chap8/FactoryMain.java @@ -4,7 +4,9 @@ import java.util.Map; import java.util.function.Supplier; - +/** + * supplier + */ public class FactoryMain { public static void main(String[] args) { @@ -14,7 +16,6 @@ public static void main(String[] args) { Product p2 = loanSupplier.get(); Product p3 = ProductFactory.createProductLambda("loan"); - } static private class ProductFactory { diff --git a/src/main/java/lambdasinaction/chap8/ObserverMain.java b/src/main/java/lambdasinaction/chap8/ObserverMain.java index dcd8cb50..1871fb50 100644 --- a/src/main/java/lambdasinaction/chap8/ObserverMain.java +++ b/src/main/java/lambdasinaction/chap8/ObserverMain.java @@ -13,7 +13,6 @@ public static void main(String[] args) { f.registerObserver(new LeMonde()); f.notifyObservers("The queen said her favourite book is Java 8 in Action!"); - Feed feedLambda = new Feed(); feedLambda.registerObserver((String tweet) -> { From 627528a046c977ac6e0a149ab47aacb8776c4da3 Mon Sep 17 00:00:00 2001 From: zhoujianjun Date: Tue, 14 Apr 2020 14:29:06 +0800 Subject: [PATCH 3/5] =?UTF-8?q?1=E3=80=812020-04-14=2014:28:57?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lambdasinaction/chap8/Peek.java | 2 +- src/main/java/lambdasinaction/chap8/StrategyMain.java | 1 - src/main/java/lambdasinaction/chap9/Intro.java | 2 ++ src/main/java/lambdasinaction/chap9/Letter.java | 3 +++ 4 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/main/java/lambdasinaction/chap8/Peek.java b/src/main/java/lambdasinaction/chap8/Peek.java index e25d68a4..dd353a7b 100644 --- a/src/main/java/lambdasinaction/chap8/Peek.java +++ b/src/main/java/lambdasinaction/chap8/Peek.java @@ -10,7 +10,7 @@ public class Peek { public static void main(String[] args) { - List result = Stream.of(2, 3, 4, 5) + List result = Stream.of(2, 3, 4, 5, 7, 9, 11) .peek(x -> System.out.println("taking from stream: " + x)).map(x -> x + 17) .peek(x -> System.out.println("after map: " + x)).filter(x -> x % 2 == 0) .peek(x -> System.out.println("after filter: " + x)).limit(3) diff --git a/src/main/java/lambdasinaction/chap8/StrategyMain.java b/src/main/java/lambdasinaction/chap8/StrategyMain.java index cc899aa8..2ae792bf 100644 --- a/src/main/java/lambdasinaction/chap8/StrategyMain.java +++ b/src/main/java/lambdasinaction/chap8/StrategyMain.java @@ -10,7 +10,6 @@ public static void main(String[] args) { Validator v2 = new Validator(new IsAllLowerCase ()); System.out.println(v2.validate("bbbb")); - // with lambdas Validator v3 = new Validator((String s) -> s.matches("\\d+")); System.out.println(v3.validate("aaaa")); diff --git a/src/main/java/lambdasinaction/chap9/Intro.java b/src/main/java/lambdasinaction/chap9/Intro.java index d540a705..7bc37f4e 100644 --- a/src/main/java/lambdasinaction/chap9/Intro.java +++ b/src/main/java/lambdasinaction/chap9/Intro.java @@ -13,5 +13,7 @@ public static void main(String...args){ // naturalOrder is a static method numbers.sort(Comparator.naturalOrder()); System.out.println(numbers); + numbers.sort(Comparator.comparing(Integer::intValue).reversed()); + System.out.println(numbers); } } diff --git a/src/main/java/lambdasinaction/chap9/Letter.java b/src/main/java/lambdasinaction/chap9/Letter.java index 2ff65193..682872f4 100644 --- a/src/main/java/lambdasinaction/chap9/Letter.java +++ b/src/main/java/lambdasinaction/chap9/Letter.java @@ -2,6 +2,9 @@ import java.util.function.Function; +/** + * Function + */ public class Letter{ public static String addHeader(String text){ return "From Raoul, Mario and Alan:" + text; From 72ccced525043392d32b48776e796945d26d26ad Mon Sep 17 00:00:00 2001 From: zhoujianjun Date: Wed, 15 Apr 2020 19:04:29 +0800 Subject: [PATCH 4/5] =?UTF-8?q?1=E3=80=812020-04-15=2019:04:18?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../lambdasinaction/chap11/AsyncShop.java | 2 +- .../chap11/BestPriceFinder.java | 2 +- .../chap11/BestPriceFinderMain.java | 3 +++ .../java/lambdasinaction/chap11/Util.java | 2 +- .../chap12/DateTimeExamples.java | 14 ++++++++--- .../lambdasinaction/chap13/Recursion.java | 24 +++++++++++++++++++ .../lambdasinaction/chap13/SubsetsMain.java | 3 +++ .../lambdasinaction/chap14/Combinators.java | 16 +++++++++++++ .../chap5/MappingAndFlatMapping.java | 9 +++++++ 9 files changed, 69 insertions(+), 6 deletions(-) diff --git a/src/main/java/lambdasinaction/chap11/AsyncShop.java b/src/main/java/lambdasinaction/chap11/AsyncShop.java index 9d537368..dcd2ae95 100644 --- a/src/main/java/lambdasinaction/chap11/AsyncShop.java +++ b/src/main/java/lambdasinaction/chap11/AsyncShop.java @@ -35,7 +35,7 @@ public Future getPrice(String product) { private double calculatePrice(String product) { delay(); - if (true) throw new RuntimeException("product not available"); + // if (true) throw new RuntimeException("product not available"); return format(random.nextDouble() * product.charAt(0) + product.charAt(1)); } diff --git a/src/main/java/lambdasinaction/chap11/BestPriceFinder.java b/src/main/java/lambdasinaction/chap11/BestPriceFinder.java index 51412e93..89abf9f3 100644 --- a/src/main/java/lambdasinaction/chap11/BestPriceFinder.java +++ b/src/main/java/lambdasinaction/chap11/BestPriceFinder.java @@ -44,7 +44,7 @@ public List findPricesParallel(String product) { public List findPricesFuture(String product) { List> priceFutures = findPricesStream(product) - .collect(Collectors.>toList()); + .collect(Collectors.toList()); return priceFutures.stream() .map(CompletableFuture::join) diff --git a/src/main/java/lambdasinaction/chap11/BestPriceFinderMain.java b/src/main/java/lambdasinaction/chap11/BestPriceFinderMain.java index 43ec8fba..e0e49631 100644 --- a/src/main/java/lambdasinaction/chap11/BestPriceFinderMain.java +++ b/src/main/java/lambdasinaction/chap11/BestPriceFinderMain.java @@ -3,6 +3,9 @@ import java.util.List; import java.util.function.Supplier; +/** + * 异步计算future completableFuture parallel + */ public class BestPriceFinderMain { private static BestPriceFinder bestPriceFinder = new BestPriceFinder(); diff --git a/src/main/java/lambdasinaction/chap11/Util.java b/src/main/java/lambdasinaction/chap11/Util.java index a72c4d33..8a05c858 100644 --- a/src/main/java/lambdasinaction/chap11/Util.java +++ b/src/main/java/lambdasinaction/chap11/Util.java @@ -15,7 +15,7 @@ public class Util { public static void delay() { int delay = 1000; - //int delay = 500 + RANDOM.nextInt(2000); + // int delay = 500 + RANDOM.nextInt(2000); try { Thread.sleep(delay); } catch (InterruptedException e) { diff --git a/src/main/java/lambdasinaction/chap12/DateTimeExamples.java b/src/main/java/lambdasinaction/chap12/DateTimeExamples.java index 46895cc5..48144142 100644 --- a/src/main/java/lambdasinaction/chap12/DateTimeExamples.java +++ b/src/main/java/lambdasinaction/chap12/DateTimeExamples.java @@ -47,6 +47,8 @@ private static void useOldDate() { Calendar calendar = Calendar.getInstance(); calendar.set(2014, Calendar.FEBRUARY, 18); System.out.println(calendar); + + System.out.println(); } private static void useLocalDate() { @@ -59,9 +61,9 @@ private static void useLocalDate() { boolean leap = date.isLeapYear(); // false (not a leap year) System.out.println(date); - int y = date.get(ChronoField.YEAR); - int m = date.get(ChronoField.MONTH_OF_YEAR); - int d = date.get(ChronoField.DAY_OF_MONTH); + int y = date.get(ChronoField.YEAR); // 2014 + int m = date.get(ChronoField.MONTH_OF_YEAR); // 3 + int d = date.get(ChronoField.DAY_OF_MONTH); // 18 LocalTime time = LocalTime.of(13, 45, 20); // 13:45:20 int hour = time.getHour(); // 13 @@ -94,6 +96,8 @@ private static void useLocalDate() { JapaneseDate japaneseDate = JapaneseDate.from(date); System.out.println(japaneseDate); + + System.out.println(); } private static void useTemporalAdjuster() { @@ -120,6 +124,8 @@ private static void useTemporalAdjuster() { return temporal.plus(dayToAdd, ChronoUnit.DAYS); }); System.out.println(date); + + System.out.println(); } private static class NextWorkingDay implements TemporalAdjuster { @@ -152,6 +158,8 @@ private static void useDateFormatter() { .toFormatter(Locale.ITALIAN); System.out.println(date.format(complexFormatter)); + + System.out.println(); } } diff --git a/src/main/java/lambdasinaction/chap13/Recursion.java b/src/main/java/lambdasinaction/chap13/Recursion.java index 77f66d57..ede08c29 100644 --- a/src/main/java/lambdasinaction/chap13/Recursion.java +++ b/src/main/java/lambdasinaction/chap13/Recursion.java @@ -12,6 +12,11 @@ public static void main(String[] args) { System.out.println(factorialTailRecursive(5)); } + /** + * 阶乘 + * @param n + * @return + */ public static int factorialIterative(int n) { int r = 1; for (int i = 1; i <= n; i++) { @@ -20,10 +25,20 @@ public static int factorialIterative(int n) { return r; } + /** + * 阶乘-递归 + * @param n + * @return + */ public static long factorialRecursive(long n) { return n == 1 ? 1 : n*factorialRecursive(n-1); } + /** + * 阶乘-stream + * @param n + * @return + */ public static long factorialStreams(long n){ return LongStream.rangeClosed(1, n) .reduce(1, (long a, long b) -> a * b); @@ -33,6 +48,15 @@ public static long factorialTailRecursive(long n) { return factorialHelper(1, n); } + /** + * 1):n + * 2):n*(n-1) + * 3):n*(n-1)*(n-2) + * 4):n*(n-1)*(n-2)*(n-3) + * @param acc + * @param n + * @return + */ public static long factorialHelper(long acc, long n) { return n == 1 ? acc : factorialHelper(acc * n, n-1); } diff --git a/src/main/java/lambdasinaction/chap13/SubsetsMain.java b/src/main/java/lambdasinaction/chap13/SubsetsMain.java index 02b51998..670bf7c9 100644 --- a/src/main/java/lambdasinaction/chap13/SubsetsMain.java +++ b/src/main/java/lambdasinaction/chap13/SubsetsMain.java @@ -5,6 +5,9 @@ import java.util.Collections; import java.util.List; +/** + * 全部子集 + */ public class SubsetsMain { public static void main(String[] args) { diff --git a/src/main/java/lambdasinaction/chap14/Combinators.java b/src/main/java/lambdasinaction/chap14/Combinators.java index 7ae5dfd2..8320b0c5 100644 --- a/src/main/java/lambdasinaction/chap14/Combinators.java +++ b/src/main/java/lambdasinaction/chap14/Combinators.java @@ -2,6 +2,22 @@ import java.util.function.Function; +/** + * repeat(1,f) = x->2*x + * repeat(n,f) = compose(f,n-1) + * compose(f,n-1) = g(repeat(n-1,f)) = 2 * repeat(n-1,f) + * f(x) = x->2*x + * g(x) = f(x) = x->2*x + * g(f(x)) = 2*x + * repeat(0,f)= x->x + * 推理: + * f(x) = x->2*x + * repeat(3,f)= compose(f,repeat(2,f)) = f(repeat(2,f))= repeat(2,f)->2*repeat(2,f) + * repeat(2,f)= compose(f,repeat(1,f)) = 2*repeat(1,f) + * repeat(1,f)= compose(f,repeat(0,f)) = 2*repeat(0,f) + * repeat(0,f)= x->x + * x=10 + */ public class Combinators { public static void main(String[] args) { diff --git a/src/main/java/lambdasinaction/chap5/MappingAndFlatMapping.java b/src/main/java/lambdasinaction/chap5/MappingAndFlatMapping.java index 51d15bea..d4bac217 100644 --- a/src/main/java/lambdasinaction/chap5/MappingAndFlatMapping.java +++ b/src/main/java/lambdasinaction/chap5/MappingAndFlatMapping.java @@ -59,5 +59,14 @@ public static void main(String[] args) { return new int[]{n, m}; }); }).collect(Collectors.toList()); + + // 单个元素抓换 + List list1 = Arrays.asList(1, 2, 3).stream().map(t -> t * 2).collect(Collectors.toList()); + + List list2 = Arrays.asList(1, 2, 3).stream().flatMap(t -> { + return Stream.of(t * 2); + }).collect(Collectors.toList()); + + System.out.println("1111111"); } } \ No newline at end of file From 8da116e6eec5ca85096a087a8dd9994597da1a31 Mon Sep 17 00:00:00 2001 From: zhoujianjun Date: Thu, 16 Apr 2020 14:26:21 +0800 Subject: [PATCH 5/5] =?UTF-8?q?1=E3=80=812020-04-16=2014:26:14?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/lambdasinaction/chap14/Currying.java | 1 - .../java/lambdasinaction/chap14/LazyLists.java | 2 +- .../chap14/PersistentTrainJourney.java | 6 +++--- .../lambdasinaction/chap14/PersistentTree.java | 14 +++++++------- 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/lambdasinaction/chap14/Currying.java b/src/main/java/lambdasinaction/chap14/Currying.java index f17ac928..01a48e6e 100644 --- a/src/main/java/lambdasinaction/chap14/Currying.java +++ b/src/main/java/lambdasinaction/chap14/Currying.java @@ -2,7 +2,6 @@ import java.util.function.DoubleUnaryOperator; - public class Currying { public static void main(String[] args) { diff --git a/src/main/java/lambdasinaction/chap14/LazyLists.java b/src/main/java/lambdasinaction/chap14/LazyLists.java index 658e0940..9ad1d5b5 100644 --- a/src/main/java/lambdasinaction/chap14/LazyLists.java +++ b/src/main/java/lambdasinaction/chap14/LazyLists.java @@ -9,7 +9,7 @@ public static void main(String[] args) { MyList l = new MyLinkedList<>(5, new MyLinkedList<>(10, new Empty())); - System.out.println(l.head()); + System.out.println(l.head()); // 5 LazyList numbers = from(2); int two = numbers.head(); diff --git a/src/main/java/lambdasinaction/chap14/PersistentTrainJourney.java b/src/main/java/lambdasinaction/chap14/PersistentTrainJourney.java index 7e958a14..087ac360 100644 --- a/src/main/java/lambdasinaction/chap14/PersistentTrainJourney.java +++ b/src/main/java/lambdasinaction/chap14/PersistentTrainJourney.java @@ -13,9 +13,9 @@ public static void main(String[] args) { System.out.println(); // A new TrainJourney is created without altering tj1 and tj2. - TrainJourney appended2 = append(tj1, tj2); - visit(appended2, tj -> { System.out.print(tj.price + " - "); }); - System.out.println(); + // TrainJourney appended2 = append(tj1, tj2); + // visit(appended2, tj -> { System.out.print(tj.price + " - "); }); + // System.out.println(); // tj1 is altered but it's still not visible in the results. TrainJourney linked = link(tj1, tj2); diff --git a/src/main/java/lambdasinaction/chap14/PersistentTree.java b/src/main/java/lambdasinaction/chap14/PersistentTree.java index 562d4f69..df12bc25 100644 --- a/src/main/java/lambdasinaction/chap14/PersistentTree.java +++ b/src/main/java/lambdasinaction/chap14/PersistentTree.java @@ -71,12 +71,12 @@ else if (k.compareTo(t.key) < 0) public static Tree fupdate(String k, int newval, Tree t) { return (t == null) ? - new Tree(k, newval, null, null) : - k.equals(t.key) ? - new Tree(k, newval, t.left, t.right) : - k.compareTo(t.key) < 0 ? - new Tree(t.key, t.val, fupdate(k,newval, t.left), t.right) : - new Tree(t.key, t.val, t.left, fupdate(k,newval, t.right)); - } + new Tree(k, newval, null, null) : + k.equals(t.key) ? + new Tree(k, newval, t.left, t.right) : + k.compareTo(t.key) < 0 ? + new Tree(t.key, t.val, fupdate(k, newval, t.left), t.right) : + new Tree(t.key, t.val, t.left, fupdate(k, newval, t.right)); + } }