From 2bd399ce267e5013e8209c64027e1493249c86fb Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Mon, 26 Dec 2016 23:09:28 +0800
Subject: [PATCH 01/42] [add] add module java8
---
java8/pom.xml | 14 ++++
.../java8/lambda/FilteringApples.java | 81 +++++++++++++++++++
pom.xml | 3 +
3 files changed, 98 insertions(+)
create mode 100644 java8/pom.xml
create mode 100644 java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
diff --git a/java8/pom.xml b/java8/pom.xml
new file mode 100644
index 0000000..9428faf
--- /dev/null
+++ b/java8/pom.xml
@@ -0,0 +1,14 @@
+
+
+
+ java-learning
+ com.brianway.learning.java
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ java8
+
+
\ No newline at end of file
diff --git a/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java b/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
new file mode 100644
index 0000000..a06bdf1
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
@@ -0,0 +1,81 @@
+package com.brianway.learning.java8.lambda;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.Predicate;
+
+/**
+ * Created by brian on 16/12/26.
+ */
+public class FilteringApples {
+ public static void main(String[] args) {
+ List inventory = Arrays.asList(new Apple(80, "green"),
+ new Apple(155, "green"),
+ new Apple(120, "red"));
+
+ List greenApples = filter(inventory, FilteringApples::isGreenApple);
+ System.out.println(greenApples);
+
+ List greenApples2 = filter(inventory, (Apple a) -> "green".equals(a.getColor()));
+ System.out.println(greenApples2);
+
+ List heavyApples = filter(inventory, FilteringApples::isHeavyApple);
+ System.out.println(heavyApples);
+
+ List heavyApples2 = filter(inventory, (Apple a) -> a.getWeight() > 150);
+ System.out.println(heavyApples2);
+
+ }
+
+ public static List filter(List inventory, Predicate p) {
+ List result = new ArrayList<>();
+ for (Apple apple : inventory) {
+ if (p.test(apple)) {
+ result.add(apple);
+ }
+ }
+ return result;
+ }
+
+ public static boolean isGreenApple(Apple apple) {
+ return "green".equals(apple.getColor());
+ }
+
+ public static boolean isHeavyApple(Apple apple) {
+ return apple.getWeight() > 150;
+ }
+
+ public static class Apple {
+ private int weight = 0;
+ private String color = "";
+
+ public Apple(int weight, String color) {
+ this.weight = weight;
+ this.color = color;
+ }
+
+ public Integer getWeight() {
+ return weight;
+ }
+
+ public void setWeight(Integer weight) {
+ this.weight = weight;
+ }
+
+ public String getColor() {
+ return color;
+ }
+
+ public void setColor(String color) {
+ this.color = color;
+ }
+
+ public String toString() {
+ return "Apple{" +
+ "color='" + color + '\'' +
+ ", weight=" + weight +
+ '}';
+ }
+ }
+}
diff --git a/pom.xml b/pom.xml
index 5bf3a88..551090f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -13,6 +13,8 @@
UTF-8
UTF-8
+ 1.8
+ 1.8
4.11
@@ -48,6 +50,7 @@
java-base
java-container
java-io
+ java8
From dec218074be1ec3f0f1785d3a109a28f65153f6b Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Thu, 29 Dec 2016 00:21:03 +0800
Subject: [PATCH 02/42] [add] add Stream API examples
---
java8/README.md | 6 ++
.../java8/streamapi/BuildingStreams.java | 80 +++++++++++++++++
.../learning/java8/streamapi/Dish.java | 57 +++++++++++++
.../java8/streamapi/GroupingTransactions.java | 84 ++++++++++++++++++
.../java8/streamapi/PuttingIntoPractice.java | 85 +++++++++++++++++++
.../learning/java8/streamapi/StreamBasic.java | 50 +++++++++++
.../learning/java8/streamapi/Trader.java | 28 ++++++
.../learning/java8/streamapi/Transaction.java | 32 +++++++
java8/src/main/resources/data-building.txt | 2 +
9 files changed, 424 insertions(+)
create mode 100644 java8/README.md
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Dish.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/PuttingIntoPractice.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/StreamBasic.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Trader.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Transaction.java
create mode 100644 java8/src/main/resources/data-building.txt
diff --git a/java8/README.md b/java8/README.md
new file mode 100644
index 0000000..f645ce7
--- /dev/null
+++ b/java8/README.md
@@ -0,0 +1,6 @@
+# Java 8 新特性
+
+《Java 8 In Action》一书
+
+源码参考了 **java8/Java8InAction**:[https://github.com/java8/Java8InAction](https://github.com/java8/Java8InAction)
+
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
new file mode 100644
index 0000000..1dc21ba
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
@@ -0,0 +1,80 @@
+package com.brianway.learning.java8.streamapi;
+
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.function.IntSupplier;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+public class BuildingStreams {
+
+ public static void main(String... args) throws Exception {
+
+ // Stream.of
+ Stream stream = Stream.of("Java 8", "Lambdas", "In", "Action");
+ stream.map(String::toUpperCase).forEach(System.out::println);
+
+ // Stream.empty
+ Stream emptyStream = Stream.empty();
+
+ // Arrays.stream
+ int[] numbers = {2, 3, 5, 7, 11, 13};
+ System.out.println(Arrays.stream(numbers).sum());
+
+ // Stream.iterate
+ Stream.iterate(0, n -> n + 2)
+ .limit(10)
+ .forEach(System.out::println);
+
+ // fibonnaci with iterate
+ Stream.iterate(new int[] {0, 1}, t -> new int[] {t[1], t[0] + t[1]})
+ .limit(10)
+ .forEach(t -> System.out.println("(" + t[0] + ", " + t[1] + ")"));
+
+ Stream.iterate(new int[] {0, 1}, t -> new int[] {t[1], t[0] + t[1]})
+ .limit(10)
+ .map(t -> t[0])
+ .forEach(System.out::println);
+
+ // random stream of doubles with Stream.generate
+ Stream.generate(Math::random)
+ .limit(10)
+ .forEach(System.out::println);
+
+ // stream of 1s with Stream.generate
+ IntStream.generate(() -> 1)
+ .limit(5)
+ .forEach(System.out::println);
+
+ IntStream.generate(new IntSupplier() {
+ public int getAsInt() {
+ return 2;
+ }
+ }).limit(5)
+ .forEach(System.out::println);
+
+ IntSupplier fib = new IntSupplier() {
+ private int previous = 0;
+ private int current = 1;
+
+ public int getAsInt() {
+ int nextValue = this.previous + this.current;
+ this.previous = this.current;
+ this.current = nextValue;
+ return this.previous;
+ }
+ };
+ IntStream.generate(fib).limit(10).forEach(System.out::println);
+
+ String path = BuildingStreams.class.getResource("/").getPath() + "/data-building.txt";
+ long uniqueWords = Files.lines(Paths.get(path), Charset.defaultCharset())
+ .flatMap(line -> Arrays.stream(line.split(" ")))
+ .distinct()
+ .count();
+
+ System.out.println("There are " + uniqueWords + " unique words in data.txt");
+
+ }
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Dish.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Dish.java
new file mode 100644
index 0000000..5c74596
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Dish.java
@@ -0,0 +1,57 @@
+package com.brianway.learning.java8.streamapi;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class Dish {
+
+ private final String name;
+ private final boolean vegetarian;
+ private final int calories;
+ private final Type type;
+
+ public Dish(String name, boolean vegetarian, int calories, Type type) {
+ this.name = name;
+ this.vegetarian = vegetarian;
+ this.calories = calories;
+ this.type = type;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public boolean isVegetarian() {
+ return vegetarian;
+ }
+
+ public int getCalories() {
+ return calories;
+ }
+
+ public Type getType() {
+ return type;
+ }
+
+ public enum Type {
+ MEAT,
+ FISH,
+ OTHER
+ }
+
+ @Override
+ public String toString() {
+ return name;
+ }
+
+ public static final List menu =
+ Arrays.asList(new Dish("pork", false, 800, Dish.Type.MEAT),
+ new Dish("beef", false, 700, Dish.Type.MEAT),
+ new Dish("chicken", false, 400, Dish.Type.MEAT),
+ new Dish("french fries", true, 530, Dish.Type.OTHER),
+ new Dish("rice", true, 350, Dish.Type.OTHER),
+ new Dish("season fruit", true, 120, Dish.Type.OTHER),
+ new Dish("pizza", true, 550, Dish.Type.OTHER),
+ new Dish("prawns", false, 400, Dish.Type.FISH),
+ new Dish("salmon", false, 450, Dish.Type.FISH));
+}
\ No newline at end of file
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
new file mode 100644
index 0000000..4a3a41f
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
@@ -0,0 +1,84 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.stream.Collectors.groupingBy;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+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 void main(String... args) {
+ groupImperatively();
+ groupFunctionally();
+
+ }
+
+ private static void groupImperatively() {
+ Map> transactionsByCurrencies = new HashMap<>();
+ for (Transaction transaction : transactions) {
+ Currency currency = transaction.getCurrency();
+ List transactionsForCurrency = transactionsByCurrencies.get(currency);
+ if (transactionsForCurrency == null) {
+ transactionsForCurrency = new ArrayList<>();
+ transactionsByCurrencies.put(currency, transactionsForCurrency);
+ }
+ transactionsForCurrency.add(transaction);
+ }
+
+ System.out.println(transactionsByCurrencies);
+ }
+
+ private static void groupFunctionally() {
+ Map> transactionsByCurrencies = transactions.stream().collect(groupingBy(Transaction::getCurrency));
+ System.out.println(transactionsByCurrencies);
+ }
+
+ public static class Transaction {
+ private final Currency currency;
+ private final double value;
+
+ public Transaction(Currency currency, double value) {
+ this.currency = currency;
+ this.value = value;
+ }
+
+ public Currency getCurrency() {
+ return currency;
+ }
+
+ public double getValue() {
+ return value;
+ }
+
+ @Override
+ public String toString() {
+ return currency + " " + value;
+ }
+ }
+
+ public enum Currency {
+ EUR,
+ USD,
+ JPY,
+ GBP,
+ CHF
+ }
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/PuttingIntoPractice.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/PuttingIntoPractice.java
new file mode 100644
index 0000000..c27f3ed
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/PuttingIntoPractice.java
@@ -0,0 +1,85 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import java.util.Arrays;
+import java.util.List;
+
+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)
+ );
+
+ // 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);
+
+ // 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);
+
+ // 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);
+
+ // 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);
+
+ // Query 5: Are there any trader based in Milan?
+
+ boolean milanBased =
+ transactions.stream()
+ .anyMatch(transaction -> transaction.getTrader()
+ .getCity()
+ .equals("Milan")
+ );
+ System.out.println(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);
+
+ // 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);
+ }
+}
\ No newline at end of file
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/StreamBasic.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/StreamBasic.java
new file mode 100644
index 0000000..7f516a5
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/StreamBasic.java
@@ -0,0 +1,50 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+
+public class StreamBasic {
+
+ public static void main(String... args) {
+ // Java 7
+ getLowCaloricDishesNamesInJava7(Dish.menu).forEach(System.out::println);
+
+ System.out.println("---");
+
+ // Java 8
+ getLowCaloricDishesNamesInJava8(Dish.menu).forEach(System.out::println);
+
+ }
+
+ public static List getLowCaloricDishesNamesInJava7(List dishes) {
+ List lowCaloricDishes = new ArrayList<>();
+ 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) {
+ return Integer.compare(d1.getCalories(), d2.getCalories());
+ }
+ });
+ for (Dish d : lowCaloricDishes) {
+ lowCaloricDishesName.add(d.getName());
+ }
+ return lowCaloricDishesName;
+ }
+
+ public static List getLowCaloricDishesNamesInJava8(List dishes) {
+ return dishes.stream()
+ .filter(d -> d.getCalories() < 400)
+ .sorted(comparing(Dish::getCalories))
+ .map(Dish::getName)
+ .collect(toList());
+ }
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Trader.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Trader.java
new file mode 100644
index 0000000..b008b12
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Trader.java
@@ -0,0 +1,28 @@
+package com.brianway.learning.java8.streamapi;
+
+public class Trader {
+
+ private String name;
+ private String city;
+
+ public Trader(String n, String c) {
+ this.name = n;
+ this.city = c;
+ }
+
+ public String getName() {
+ return this.name;
+ }
+
+ public String getCity() {
+ return this.city;
+ }
+
+ public void setCity(String newCity) {
+ this.city = newCity;
+ }
+
+ public String toString() {
+ return "Trader:" + this.name + " in " + this.city;
+ }
+}
\ No newline at end of file
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Transaction.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Transaction.java
new file mode 100644
index 0000000..656149c
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Transaction.java
@@ -0,0 +1,32 @@
+package com.brianway.learning.java8.streamapi;
+
+public class Transaction {
+
+ private Trader trader;
+ private int year;
+ private int value;
+
+ public Transaction(Trader trader, int year, int value) {
+ this.trader = trader;
+ this.year = year;
+ this.value = value;
+ }
+
+ public Trader getTrader() {
+ return this.trader;
+ }
+
+ public int getYear() {
+ return this.year;
+ }
+
+ public int getValue() {
+ return this.value;
+ }
+
+ public String toString() {
+ return "{" + this.trader + ", " +
+ "year: " + this.year + ", " +
+ "value:" + this.value + "}";
+ }
+}
\ No newline at end of file
diff --git a/java8/src/main/resources/data-building.txt b/java8/src/main/resources/data-building.txt
new file mode 100644
index 0000000..2230972
--- /dev/null
+++ b/java8/src/main/resources/data-building.txt
@@ -0,0 +1,2 @@
+The quick brown fox jumped over the lazy dog
+The lazy dog jumped over the quick brown fox
From 874c3c4800d8943c81d340e7a930931334364fbd Mon Sep 17 00:00:00 2001
From: brianway <250902678@qq.com>
Date: Sat, 7 Jan 2017 23:03:43 +0800
Subject: [PATCH 03/42] [add] add some stream api examples
---
.../java8/lambda/FilteringApples.java | 2 +
.../java8/streamapi/BuildingStreams.java | 10 +-
.../java8/streamapi/GroupingTransactions.java | 3 +
.../learning/java8/streamapi/Laziness.java | 30 +++++
.../learning/java8/streamapi/Mapping.java | 48 +++++++
.../streamapi/PartitionPrimeNumbers.java | 121 ++++++++++++++++++
.../learning/java8/streamapi/Reducing.java | 30 +++++
.../learning/java8/streamapi/StreamBasic.java | 3 +
8 files changed, 242 insertions(+), 5 deletions(-)
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Mapping.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/PartitionPrimeNumbers.java
create mode 100644 java8/src/main/java/com/brianway/learning/java8/streamapi/Reducing.java
diff --git a/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java b/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
index a06bdf1..e04b739 100644
--- a/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
+++ b/java8/src/main/java/com/brianway/learning/java8/lambda/FilteringApples.java
@@ -7,6 +7,8 @@
/**
* Created by brian on 16/12/26.
+ *
+ *
*/
public class FilteringApples {
public static void main(String[] args) {
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
index 1dc21ba..13d0cd3 100644
--- a/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/BuildingStreams.java
@@ -8,6 +8,9 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
+/**
+ * 斐波拉切数列的几种生成方法
+ */
public class BuildingStreams {
public static void main(String... args) throws Exception {
@@ -48,11 +51,8 @@ public static void main(String... args) throws Exception {
.limit(5)
.forEach(System.out::println);
- IntStream.generate(new IntSupplier() {
- public int getAsInt() {
- return 2;
- }
- }).limit(5)
+ IntStream.generate(() -> 2)
+ .limit(5)
.forEach(System.out::println);
IntSupplier fib = new IntSupplier() {
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
index 4a3a41f..35a122e 100644
--- a/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/GroupingTransactions.java
@@ -8,6 +8,9 @@
import java.util.List;
import java.util.Map;
+/**
+ * 分别使用指令式和函数式进行分组
+ */
public class GroupingTransactions {
public static List transactions = Arrays.asList(
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java
new file mode 100644
index 0000000..33d2a0e
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Laziness.java
@@ -0,0 +1,30 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.stream.Collectors.toList;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 流操作-中间操作
+ */
+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());
+
+ twoEvenSquares.stream().forEach(System.out::println);
+ }
+
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/Mapping.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/Mapping.java
new file mode 100644
index 0000000..74f63c2
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/Mapping.java
@@ -0,0 +1,48 @@
+package com.brianway.learning.java8.streamapi;
+
+import static com.brianway.learning.java8.streamapi.Dish.menu;
+import static java.util.stream.Collectors.toList;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 使用流-映射
+ * 注意扁平映射
+ */
+public class Mapping {
+
+ public static void main(String... args) {
+
+ // map
+ List dishNames = menu.stream()
+ .map(Dish::getName)
+ .collect(toList());
+ System.out.println(dishNames);
+
+ // map
+ List words = Arrays.asList("Hello", "World");
+ List wordLengths = words.stream()
+ .map(String::length)
+ .collect(toList());
+ System.out.println(wordLengths);
+
+ // flatMap
+ words.stream()
+ .flatMap((String line) -> Arrays.stream(line.split("")))
+ .distinct()
+ .forEach(System.out::println);
+
+ // flatMap
+ List numbers1 = Arrays.asList(1, 2, 3, 4, 5);
+ List numbers2 = Arrays.asList(6, 7, 8);
+ List pairs =
+ numbers1.stream()
+ .flatMap((Integer i) -> numbers2.stream()
+ .map((Integer j) -> new int[] {i, j})
+ )
+ .filter(pair -> (pair[0] + pair[1]) % 3 == 0)
+ .collect(toList());
+ pairs.forEach(pair -> System.out.println("(" + pair[0] + ", " + pair[1] + ")"));
+ }
+}
diff --git a/java8/src/main/java/com/brianway/learning/java8/streamapi/PartitionPrimeNumbers.java b/java8/src/main/java/com/brianway/learning/java8/streamapi/PartitionPrimeNumbers.java
new file mode 100644
index 0000000..3d0e73e
--- /dev/null
+++ b/java8/src/main/java/com/brianway/learning/java8/streamapi/PartitionPrimeNumbers.java
@@ -0,0 +1,121 @@
+package com.brianway.learning.java8.streamapi;
+
+import static java.util.stream.Collector.Characteristics.IDENTITY_FINISH;
+import static java.util.stream.Collectors.partitioningBy;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+/**
+ * 分区:分类的特殊情况。分区函数返回一个布尔值
+ */
+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(PartitionPrimeNumbers::isPrime));
+ }
+
+ 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 primes.stream().filter(p -> p < candidateRoot).noneMatch(p -> candidate % p == 0);
+ return takeWhile(primes, i -> i <= candidateRoot).stream().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