dishes) {
return dishes.stream()
.filter(d -> d.getCalories() < 400)
.sorted(comparing(Dish::getCalories))
diff --git a/src/main/java/lambdasinaction/chap4/StreamParallellTest.java b/src/main/java/lambdasinaction/chap4/StreamParallellTest.java
new file mode 100644
index 00000000..30cfd663
--- /dev/null
+++ b/src/main/java/lambdasinaction/chap4/StreamParallellTest.java
@@ -0,0 +1,57 @@
+package lambdasinaction.chap4;
+
+import org.apache.commons.collections4.ListUtils;
+
+import java.util.List;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+/**
+ * @author vector
+ * @date: 2018/10/18 0018 10:00
+ *
+ * List> -> List>
+ *
+ * 使用parallelstream需注意【共享对象的可变状态】
+ * 如使用foreach就能改变其状态
+ * 需要特别注意下
+ */
+public class StreamParallellTest {
+
+ public static List sum(List items, int count) {
+ List> listList = ListUtils.partition(items, count);
+ return listList.stream().flatMap(List::stream).map(StreamParallellTest::delayFun).collect(Collectors.toList());
+ }
+
+ public static List parallelSum(List items, int count) {
+ List> listList = ListUtils.partition(items, count);
+ return listList.parallelStream().flatMap(List::stream).map(StreamParallellTest::delayFun).collect(Collectors.toList());
+ }
+
+ public static String delayFun(int digist) {
+ try {
+ Thread.sleep(digist);
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ }
+ return digist + "";
+ }
+
+ private static void execute(String msg, Supplier> supplier) {
+ long s = System.nanoTime();
+ supplier.get();
+ long e = System.nanoTime();
+ long duration = (e - s) / 1_000_000;
+
+ System.out.println(msg + " done in " + duration + " msecs");
+ }
+
+
+ public static void main(String[] args) {
+ List items = IntStream.rangeClosed(1, 50).boxed().collect(Collectors.toList());
+ System.out.println(items);
+ execute("sum", () -> sum(items, 10));
+ execute("parallelSum", () -> parallelSum(items, 10));
+ }
+}
diff --git a/src/main/java/lambdasinaction/chap5/Demo522.java b/src/main/java/lambdasinaction/chap5/Demo522.java
new file mode 100644
index 00000000..348b8cc2
--- /dev/null
+++ b/src/main/java/lambdasinaction/chap5/Demo522.java
@@ -0,0 +1,21 @@
+package lambdasinaction.chap5;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import static java.util.stream.Collectors.toList;
+
+/**
+ * @author vector
+ * @date: 2018/9/29 0029 15:48
+ */
+public class Demo522 {
+ public static void main(String[] args) {
+ List hw = Arrays.asList("Hello", "World");
+ List collect = hw.stream().map(word -> word.split("")).flatMap(Arrays::stream).distinct().collect(toList());
+ System.out.println(collect);
+ }
+}
diff --git a/src/main/java/lambdasinaction/chap5/Demo551.java b/src/main/java/lambdasinaction/chap5/Demo551.java
new file mode 100644
index 00000000..8fa16d23
--- /dev/null
+++ b/src/main/java/lambdasinaction/chap5/Demo551.java
@@ -0,0 +1,36 @@
+package lambdasinaction.chap5;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+
+/**
+ * @author vector
+ * @date: 2018/9/29 0029 16:48
+ */
+public class Demo551 {
+ public static void main(String[] args) {
+ List list = new ArrayList<>();
+ List list1 = list.stream().filter(item -> item.getYear() == 2011).sorted(comparing(Transaction::getValue)).collect(toList());
+
+ Set set2 = list.stream().map(item -> item.getTrader().getCity()).collect(Collectors.toSet());
+
+ List list3 = list.stream().map(Transaction::getTrader).filter(item -> item.getCity().equals("剑桥")).distinct().sorted(comparing(Trader::getName)).collect(toList());
+
+ String collect4 = list.stream().map(item -> item.getTrader().getName()).distinct().sorted().collect(joining());
+
+ boolean boolean5 = list.stream().anyMatch(item -> item.getTrader().getCity().equals("米兰"));
+
+ list.stream().filter(item->item.getTrader().getCity().equals("剑桥")).map(Transaction::getValue).forEach(System.out::println);
+
+ Optional first7 = list.stream().map(Transaction::getValue).sorted(Integer::compareTo).limit(1).findFirst();
+
+ list.stream().min(comparing(Transaction::getValue));
+
+
+
+ }
+}
diff --git a/src/main/java/lambdasinaction/chap6/CollectorHarness.java b/src/main/java/lambdasinaction/chap6/CollectorHarness.java
index 8370be16..d8049d2a 100644
--- a/src/main/java/lambdasinaction/chap6/CollectorHarness.java
+++ b/src/main/java/lambdasinaction/chap6/CollectorHarness.java
@@ -5,8 +5,8 @@
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" );
+ 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) {
diff --git a/src/main/java/lambdasinaction/chap6/Demo62.java b/src/main/java/lambdasinaction/chap6/Demo62.java
new file mode 100644
index 00000000..f829a260
--- /dev/null
+++ b/src/main/java/lambdasinaction/chap6/Demo62.java
@@ -0,0 +1,26 @@
+package lambdasinaction.chap6;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Demo62 {
+ public static List transactions = Arrays
+ .asList( new GroupingTransactions.Transaction(GroupingTransactions.Currency.EUR, 1500.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.USD, 2300.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.GBP, 9900.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.EUR, 1100.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.JPY, 7800.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.CHF, 6700.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.EUR, 5600.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.USD, 4500.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.CHF, 3400.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.GBP, 3200.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.USD, 4600.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.JPY, 5700.0),
+ new GroupingTransactions.Transaction(GroupingTransactions.Currency.EUR, 6800.0) );
+
+ public static void main(String[] args) {
+ System.out.println(transactions.size());
+ System.out.println(transactions.stream().count());
+ }
+}
diff --git a/src/main/java/lambdasinaction/chap6/Grouping.java b/src/main/java/lambdasinaction/chap6/Grouping.java
index 9105cc80..d2642a7f 100644
--- a/src/main/java/lambdasinaction/chap6/Grouping.java
+++ b/src/main/java/lambdasinaction/chap6/Grouping.java
@@ -13,8 +13,8 @@ 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("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());
@@ -32,14 +32,14 @@ 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() {
+// 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())));
- }
+// return menu.stream().collect(groupingBy(Dish::getType, filtering(dish -> dish.getCalories() > 500, toList())));
+// }
private static Map> groupDishesByCaloricLevel() {
return menu.stream().collect(
@@ -63,16 +63,22 @@ private static Map>> groupDishedByTypeAn
}
private static Map countDishesInGroups() {
+ Map collect = menu.stream().collect(groupingBy(Dish::getType, counting()));
return menu.stream().collect(groupingBy(Dish::getType, counting()));
}
private static Map> mostCaloricDishesByType() {
+ menu.stream().collect(groupingBy(Dish::getType, reducing((d1, d2) -> d1.getCalories() > d2.getCalories() ? d1 : d2)));
+
+
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(
@@ -86,6 +92,8 @@ private static Map sumCaloriesByType() {
}
private static Map> caloricLevelsByType() {
+
+
return menu.stream().collect(
groupingBy(Dish::getType, mapping(
dish -> { if (dish.getCalories() <= 400) return CaloricLevel.DIET;
diff --git a/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java b/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java
index 69d7c4ca..cd4c3990 100644
--- a/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java
+++ b/src/main/java/lambdasinaction/chap6/PartitionPrimeNumbers.java
@@ -32,10 +32,10 @@ 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 takeWhile(primes, i -> i <= candidateRoot).stream().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) {
@@ -46,16 +46,26 @@ public static List takeWhile(List list, Predicate p) {
}
return list;
}
-*/
+
public static class PrimeNumbersCollector
implements Collector>, Map>> {
@Override
public Supplier