diff --git a/pom.xml b/pom.xml
index f293a32f193c3ed4b53cd61279d5c08eafcbec08..b83b59efd7c9fba2dbd8c9bbb801979ec315125b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -40,6 +40,11 @@
lombok
true
+
+ junit
+ junit
+ test
+
diff --git a/src/test/java/com/wind/java8learn/model/Employee.java b/src/test/java/com/wind/java8learn/model/Employee.java
index e7c1b403b9eadfcdb39f54f5a1e458f4acec667f..89d3be3217c48154d825d106cb0f4a0ee3314f57 100644
--- a/src/test/java/com/wind/java8learn/model/Employee.java
+++ b/src/test/java/com/wind/java8learn/model/Employee.java
@@ -16,6 +16,7 @@ import java.util.Objects;
@RequiredArgsConstructor
@AllArgsConstructor
public class Employee {
+
@NonNull
private String name;
@NonNull
@@ -26,7 +27,6 @@ public class Employee {
private Status status;
-
@Override
public boolean equals(Object o) {
if (this == o) return true;
@@ -48,7 +48,7 @@ public class Employee {
public enum Status{
FREE,
BUSY,
- VOCATION;
+ VOCATION
}
}
diff --git a/src/test/java/com/wind/java8learn/model/Trader.java b/src/test/java/com/wind/java8learn/model/Trader.java
new file mode 100644
index 0000000000000000000000000000000000000000..76608317716b7d5ce583f56b01cf4b35732b6194
--- /dev/null
+++ b/src/test/java/com/wind/java8learn/model/Trader.java
@@ -0,0 +1,37 @@
+package com.wind.java8learn.model;
+//交易员类
+public class Trader {
+
+ private String name;
+ private String city;
+
+ public Trader() {
+ }
+
+ public Trader(String name, String city) {
+ this.name = name;
+ this.city = city;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getCity() {
+ return city;
+ }
+
+ public void setCity(String city) {
+ this.city = city;
+ }
+
+ @Override
+ public String toString() {
+ return "Trader [name=" + name + ", city=" + city + "]";
+ }
+
+}
diff --git a/src/test/java/com/wind/java8learn/model/Transaction.java b/src/test/java/com/wind/java8learn/model/Transaction.java
new file mode 100644
index 0000000000000000000000000000000000000000..240efeff1960bcb5eb467fcdb2bf1af7d9ac160a
--- /dev/null
+++ b/src/test/java/com/wind/java8learn/model/Transaction.java
@@ -0,0 +1,20 @@
+package com.wind.java8learn.model;
+//交易类
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+
+@Data
+@AllArgsConstructor
+public class Transaction {
+
+ private Trader trader;
+
+ private int year;
+
+ private int value;
+
+
+
+}
diff --git a/src/test/java/com/wind/java8learn/streamapi/StreamAPICollectTest.java b/src/test/java/com/wind/java8learn/streamapi/StreamAPICollectTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..03b120eb3bc8e00a54f566c965d912f3388d1d68
--- /dev/null
+++ b/src/test/java/com/wind/java8learn/streamapi/StreamAPICollectTest.java
@@ -0,0 +1,165 @@
+package com.wind.java8learn.streamapi;
+
+import com.wind.java8learn.model.Employee;
+import org.junit.jupiter.api.Test;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @Author :wind
+ * @Description : 收集 collect
+ * 将流转换为其他形式,接收一个Collector接口的实现,用于给Stream元素做汇总的方法
+ * @Date : 2020/1/2 17:55
+ */
+public class StreamAPICollectTest {
+
+ List employeeList = Arrays.asList(
+ //new Employee("张三", 29, 19800.00, Employee.Status.FREE),
+ new Employee("李四", 19, 8800.00, Employee.Status.BUSY),
+ new Employee("王五", 21, 10800.00,Employee.Status.BUSY),
+ new Employee("麻子", 54, 13900.00,Employee.Status.FREE),
+ new Employee("大佬", 24, 10600.00,Employee.Status.BUSY),
+ new Employee("麻子", 50, 10900.00,Employee.Status.BUSY),
+ new Employee("麻子3", 27, 10900.00,Employee.Status.FREE)
+ );
+
+ /**
+ * 将 雇员的名字收集起来并放到一个list中
+ */
+ @Test
+ public void test(){
+ List stringList = employeeList.stream()
+ .map(Employee::getName)
+ .collect(Collectors.toList());
+ stringList.forEach(System.out::println);
+
+ System.out.println("==========收集到set中=============");
+
+ //将 雇员的名字收集起来并放到一个set中
+ Set stringSet = employeeList.stream()
+ .map(Employee::getName)
+ .collect(Collectors.toSet());
+ stringSet.forEach(System.out::println);
+
+ System.out.println("======收集到特殊的集合中======");
+ HashSet stringHashSet = employeeList.stream()
+ .map(Employee::getName)
+ .collect(Collectors.toCollection(HashSet::new));
+ stringHashSet.forEach(System.out::println);
+ }
+
+ @Test
+ public void test2(){
+ Long count = employeeList.stream()
+ .collect(Collectors.counting());
+ System.out.println("count:"+count);
+
+ System.out.println("------工资平均值--------");
+ Double aDouble = employeeList.stream()
+ .collect(Collectors.averagingDouble(Employee::getSalary));
+
+ System.out.println("----工资总和--------");
+ Double summingDouble = employeeList.stream()
+ .collect(Collectors.summingDouble(Employee::getSalary));
+ System.out.println("summingDouble:"+summingDouble);
+
+ System.out.println("----最大值---------");
+ Optional collectOpt = employeeList.stream()
+ .collect(Collectors.maxBy((e1, e2) ->
+ Double.compare(e1.getSalary(), e2.getSalary())
+ ));
+ System.out.println("最大值是:"+collectOpt.get());
+
+ System.out.println("----最小值---------");
+ Optional opt = employeeList.stream()
+ .collect(Collectors.minBy((e1, e2) ->
+ Double.compare(e1.getSalary(), e2.getSalary())
+ ));
+ System.out.println("----最小值是:"+opt.get());
+ }
+
+ /**
+ * 分组
+ */
+ @Test
+ public void test3(){
+ Map> collectMap = employeeList.stream()
+ .collect(Collectors.groupingBy(Employee::getStatus));
+ System.out.println(collectMap);
+
+ }
+
+ /**
+ * 多级分组
+ *
+ */
+ @Test
+ public void test4(){
+ Map>> collectMap = employeeList.stream()
+ .collect(Collectors.groupingBy(Employee::getStatus, Collectors.groupingBy(e -> {
+ if (((Employee) e).getAge() <= 35) {
+ return "青年";
+ } else if (((Employee) e).getAge() <= 50) {
+ return "中年";
+ } else {
+ return "老年";
+ }
+ })));
+ System.out.println(collectMap);
+ }
+
+ /**
+ * 分区 :满足条件的一个区域,不满足的另一个区域
+ */
+ @Test
+ public void test5(){
+ Map> map = employeeList.stream()
+ .collect(Collectors.partitioningBy(e -> e.getSalary() > 11000));
+ System.out.println(map);
+
+ }
+
+ /**
+ *
+ */
+ @Test
+ public void test6(){
+ DoubleSummaryStatistics collect = employeeList.stream()
+ .collect(Collectors.summarizingDouble(Employee::getSalary));
+ System.out.println(collect.getMax());
+ System.out.println(collect.getAverage());
+ System.out.println(collect.getSum());
+ }
+
+ /**
+ * 连接 字符串
+ */
+ @Test
+ public void test7(){
+ String str = employeeList.stream()
+ .map(Employee::getName)
+ //.collect(Collectors.joining()//连接属性值字符串,没有分隔
+ //.collect(Collectors.joining(",")// 连接属性值字符串,自定义符号如逗号 , 分隔
+ //连接属性值字符串,自定义分隔符号+自定的前缀和自定义的后缀
+ .collect(Collectors.joining(",","===","-----"));
+ System.out.println("str: "+str);
+ }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
diff --git a/src/test/java/com/wind/java8learn/streamapi/StreamApiTest.java b/src/test/java/com/wind/java8learn/streamapi/StreamAPICreateStreamTest.java
similarity index 97%
rename from src/test/java/com/wind/java8learn/streamapi/StreamApiTest.java
rename to src/test/java/com/wind/java8learn/streamapi/StreamAPICreateStreamTest.java
index a884cf2cfa16f033a4ef34ad5194cad69088b426..44c50feec9ed4e6be3ad0c6fb7092b29a9ea1aa0 100644
--- a/src/test/java/com/wind/java8learn/streamapi/StreamApiTest.java
+++ b/src/test/java/com/wind/java8learn/streamapi/StreamAPICreateStreamTest.java
@@ -17,7 +17,7 @@ import java.util.stream.Stream;
* 2、获取Stream 后 对其进行的中间操作
* 3、终止操作 (终端操作)
*/
-public class StreamApiTest {
+public class StreamAPICreateStreamTest {
/**
* 创建stream
diff --git a/src/test/java/com/wind/java8learn/streamapi/StreamAPIEndTest.java b/src/test/java/com/wind/java8learn/streamapi/StreamAPIEndTest.java
index 7e50c39a143237f9fb4e772f4519b360722950d5..b884e42608fd832d1900a5199105f3d4b696b78c 100644
--- a/src/test/java/com/wind/java8learn/streamapi/StreamAPIEndTest.java
+++ b/src/test/java/com/wind/java8learn/streamapi/StreamAPIEndTest.java
@@ -104,5 +104,4 @@ public class StreamAPIEndTest {
}
-
}
diff --git a/src/test/java/com/wind/java8learn/streamapi/StreamAPIExerciseTest.java b/src/test/java/com/wind/java8learn/streamapi/StreamAPIExerciseTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..70631fafa89f0ba6a4cdeb94590adf1ba6d00c49
--- /dev/null
+++ b/src/test/java/com/wind/java8learn/streamapi/StreamAPIExerciseTest.java
@@ -0,0 +1,58 @@
+package com.wind.java8learn.streamapi;
+
+import com.wind.java8learn.model.Employee;
+import org.junit.jupiter.api.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * @Author :wind
+ * @Description : StreamAPI练习
+ * @Date : 2020/1/3 14:38
+ */
+public class StreamAPIExerciseTest {
+
+ List employeeList = Arrays.asList(
+ new Employee("张三", 29, 19800.00, Employee.Status.FREE),
+ new Employee("李四", 19, 8800.00, Employee.Status.BUSY),
+ new Employee("王五", 21, 10800.00,Employee.Status.BUSY),
+ new Employee("麻子", 25, 13900.00,Employee.Status.FREE),
+ new Employee("大佬", 24, 10600.00,Employee.Status.BUSY),
+ new Employee("麻子2", 26, 10900.00,Employee.Status.FREE),
+ new Employee("麻子3", 27, 10900.00,Employee.Status.FREE)
+ );
+
+
+ /**
+ * 1、给定 一个数字列表,如何返回一个由每个数的平方构成的列表?
+ * 要实现的:给定【1,2,3,4,5】 应该返回 【1,4,9,16,25】
+ */
+ @Test
+ public void test(){
+ Integer[] nums = {1,2,3,4,5};
+ List collect = Arrays.stream(nums)
+ .map(x -> x * x)
+ .collect(Collectors.toList());
+ System.out.println("结果:"+collect);
+ }
+
+ /**
+ * 怎么使用map-reduce 方法数一数 流中 有多少 Employee?
+ */
+ @Test
+ public void test2(){
+ Optional optional = employeeList.stream()
+ .map(x -> 1)
+ .reduce(Integer::sum);
+ System.out.println("个数是:"+optional.get());
+ }
+
+
+
+
+
+
+}
diff --git a/src/test/java/com/wind/java8learn/streamapi/StreamApiTest2.java b/src/test/java/com/wind/java8learn/streamapi/StreamAPIMiddleTest.java
similarity index 98%
rename from src/test/java/com/wind/java8learn/streamapi/StreamApiTest2.java
rename to src/test/java/com/wind/java8learn/streamapi/StreamAPIMiddleTest.java
index 0e56d3b2d70829e9d39c76c51f09f7c948d6523c..8c3150fce26803a7bf8c3a08c93e6c3b94b7cae7 100644
--- a/src/test/java/com/wind/java8learn/streamapi/StreamApiTest2.java
+++ b/src/test/java/com/wind/java8learn/streamapi/StreamAPIMiddleTest.java
@@ -19,7 +19,7 @@ import java.util.stream.Stream;
* 2、获取Stream 后 对其进行的中间操作
* 3、终止操作 (终端操作)
*/
-public class StreamApiTest2 {
+public class StreamAPIMiddleTest {
List employeeList = Arrays.asList(
new Employee("张三", 21, 10200.99),
diff --git a/src/test/java/com/wind/java8learn/streamapi/StreamReduceTest.java b/src/test/java/com/wind/java8learn/streamapi/StreamAPIReduceTest.java
similarity index 89%
rename from src/test/java/com/wind/java8learn/streamapi/StreamReduceTest.java
rename to src/test/java/com/wind/java8learn/streamapi/StreamAPIReduceTest.java
index 5a81365ab14dfd393d96cae48f4945d91c4be9f7..bd792397e1e8b22546013003fbf5e130c8252d29 100644
--- a/src/test/java/com/wind/java8learn/streamapi/StreamReduceTest.java
+++ b/src/test/java/com/wind/java8learn/streamapi/StreamAPIReduceTest.java
@@ -1,7 +1,6 @@
package com.wind.java8learn.streamapi;
import com.wind.java8learn.model.Employee;
-import lombok.NonNull;
import org.junit.jupiter.api.Test;
import java.util.Arrays;
@@ -10,11 +9,11 @@ import java.util.Optional;
/**
* @Author :wind
- * @Description : stream api 归约
+ * @Description : stream api 归约 (map-reduce 归约)
* 即 可以将流中的元素反复结合起来,得到一个值
* @Date : 2020/1/2 17:15
*/
-public class StreamReduceTest {
+public class StreamAPIReduceTest {
List employeeList = Arrays.asList(
new Employee("张三", 29, 19800.00, Employee.Status.FREE),
@@ -33,21 +32,17 @@ public class StreamReduceTest {
.reduce(0, (x, y) -> x + y);//跌加的初始值是 0
System.out.println("reduce的结果是 :"+sum);
- System.out.println("===================================");
-
+ System.out.println("==========================");
//求雇员工资的和 (两种reduce方法)
//方式一
Double reduceSum = employeeList.stream()
.map(Employee::getSalary) //提取工资
.reduce(0.00, (x, y) -> (x + y));//迭加的初始工资是 0.00
System.out.println("雇员的工资总和:"+reduceSum);
-
- //方式一 (返回的是 Optional )
+ //方式二 (返回的是 Optional )
Optional op = employeeList.stream()
.map(Employee::getSalary) //提取工资
.reduce(Double::sum);
System.out.println("雇员的工资总和:"+op.get());
-
-
}
}
diff --git a/src/test/java/com/wind/java8learn/streamapi/StreamAPITransactionTest.java b/src/test/java/com/wind/java8learn/streamapi/StreamAPITransactionTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..ac2a2a9eeed8d02a557806ec3ca2d65729b5f536
--- /dev/null
+++ b/src/test/java/com/wind/java8learn/streamapi/StreamAPITransactionTest.java
@@ -0,0 +1,168 @@
+package com.wind.java8learn.streamapi;
+
+import com.wind.java8learn.model.Trader;
+import com.wind.java8learn.model.Transaction;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @Author :wind
+ * @Description : stream api 训练
+ * @Date : 2020/1/3 17:05
+ */
+public class StreamAPITransactionTest {
+
+ List transactions = null;
+
+ @Before
+ public void before(){
+ //交易员数据
+ Trader raoul = new Trader("Raoul", "Cambridge");
+ Trader mario = new Trader("Mario", "Milan");
+ Trader alan = new Trader("Alan", "Cambridge");
+ Trader brian = new Trader("Brian", "Cambridge");
+
+ //交易数据
+ 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)
+ );
+
+ }
+
+ /**
+ * 1、找出2011年发生的所有交易,并按交易额排序(从低到高)
+ */
+ @Test
+ public void test1(){
+ List transactionList = transactions.stream()
+ .filter(x -> x.getYear() == 2011)
+ .sorted((e1,e2)-> Integer.compare(e1.getValue(),e2.getValue()))
+ .collect(Collectors.toList());//装到一个list中
+ //.forEach(System.out::println);//或者直接打印
+ System.out.println("2011年发生的所有交易,并按交易额排序 :"+transactionList);
+ }
+
+ /**
+ * 2、交易员在哪些城市工作过?
+ */
+ @Test
+ public void test2(){
+ transactions.stream()
+ .map( t ->t.getTrader().getCity())
+ .distinct()
+ .forEach(System.out::println);
+ }
+
+ /**
+ * 3、找所有来自剑桥的交易员,并按姓名排序
+ */
+ @Test
+ public void test3(){
+ transactions.stream()
+ .filter( x ->x.getTrader().getCity().equals("Cambridge"))
+ .map(Transaction::getTrader)
+ .sorted((x1,x2) -> x1.getName().compareTo(x2.getName()))
+ .distinct()
+ .forEach(System.out::println);
+ }
+
+ /**
+ * 4、 返回所有交易员的姓名字符串,按字母顺序排序
+ */
+ @Test
+ public void test4(){
+ System.out.println("-------方法一-------");
+ transactions.stream()
+ .map(x -> x.getTrader().getName())
+ .sorted()
+ .distinct()
+ .forEach(System.out::println);
+ System.out.println("------方法二--------");
+ String str = transactions.stream()
+ .map(x -> x.getTrader().getName())
+ .sorted()
+ .distinct()
+ .reduce("", String::concat);
+ System.out.println("reduce方法结果是:"+str);
+
+ System.out.println("----纯字母排序-----");
+ transactions.stream()
+ .map((t) -> t.getTrader().getName())
+ .flatMap(StreamAPITransactionTest::filterCharacter)
+ .sorted((s1, s2) -> s1.compareToIgnoreCase(s2))
+ .forEach(System.out::print);
+ }
+
+ public static Stream filterCharacter(String str){
+ List list = new ArrayList<>();
+
+ for (Character ch : str.toCharArray()) {
+ list.add(ch.toString());
+ }
+ return list.stream();
+ }
+
+ /**
+ * 5、有没有交易员是在米兰工作的?
+ */
+ @Test
+ public void test5(){
+ boolean hasMilan = transactions.stream()
+ .anyMatch(x -> x.getTrader().getCity().equals("Milan"));
+ System.out.println("是否有米兰的员工:"+hasMilan);
+ }
+
+ /**
+ *6、打印生活在剑桥的交易员的所有交易额
+ */
+ @Test
+ public void test6(){
+ Integer sum = transactions.stream()
+ .filter(x -> x.getTrader().getCity().equals("Cambridge"))
+ .map(Transaction::getValue)
+ .reduce(0, (x, y) -> (x + y));
+
+ System.out.println("剑桥的总交易额方法一:"+sum);
+
+ Optional optional = transactions.stream()
+ .filter(x -> x.getTrader().getCity().equals("Cambridge"))
+ .map(Transaction::getValue)
+ .reduce(Integer::sum);
+ System.out.println("剑桥的总交易额方法二:"+optional.get());
+ }
+
+ /**
+ * 7、最高交易额是多少?
+ */
+ @Test
+ public void test7(){
+ Optional max = transactions.stream()
+ .map(Transaction::getValue)
+ .max(Integer::compare);
+ System.out.println("最高交易额是:"+max);
+ }
+
+ /**
+ * 8、找到交易额最小的交易
+ */
+ @Test
+ public void test8(){
+ Optional minTransaction = transactions.stream()
+ .min((e1, e2) -> Integer.compare(e1.getValue(), e2.getValue()));
+ System.out.println("最小交易额信息是:"+minTransaction.get());
+ }
+
+
+}
diff --git a/src/test/java/com/wind/java8learn/streamapi/Test2.java b/src/test/java/com/wind/java8learn/streamapi/Test2.java
deleted file mode 100644
index d781a3947146ed1d19c667ab49b96d5b2193595c..0000000000000000000000000000000000000000
--- a/src/test/java/com/wind/java8learn/streamapi/Test2.java
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.wind.java8learn.streamapi;
-
-/**
- * @Author :wind
- * @Description : 提交测试
- * @Date : 2020/1/2 17:55
- */
-public class Test2 {
-}