From 154c9ef7cc1236c039117adf2dd891c715ab1bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E9=92=8A?= Date: Fri, 3 Jan 2020 18:24:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E7=9A=84=E5=AD=A6=E4=B9=A0=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E5=92=8C=E7=BB=83=E4=B9=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 5 + .../com/wind/java8learn/model/Employee.java | 4 +- .../com/wind/java8learn/model/Trader.java | 37 ++++ .../wind/java8learn/model/Transaction.java | 20 +++ .../streamapi/StreamAPICollectTest.java | 165 +++++++++++++++++ ...st.java => StreamAPICreateStreamTest.java} | 2 +- .../streamapi/StreamAPIEndTest.java | 1 - .../streamapi/StreamAPIExerciseTest.java | 58 ++++++ ...ApiTest2.java => StreamAPIMiddleTest.java} | 2 +- ...duceTest.java => StreamAPIReduceTest.java} | 13 +- .../streamapi/StreamAPITransactionTest.java | 168 ++++++++++++++++++ .../com/wind/java8learn/streamapi/Test2.java | 9 - 12 files changed, 461 insertions(+), 23 deletions(-) create mode 100644 src/test/java/com/wind/java8learn/model/Trader.java create mode 100644 src/test/java/com/wind/java8learn/model/Transaction.java create mode 100644 src/test/java/com/wind/java8learn/streamapi/StreamAPICollectTest.java rename src/test/java/com/wind/java8learn/streamapi/{StreamApiTest.java => StreamAPICreateStreamTest.java} (97%) create mode 100644 src/test/java/com/wind/java8learn/streamapi/StreamAPIExerciseTest.java rename src/test/java/com/wind/java8learn/streamapi/{StreamApiTest2.java => StreamAPIMiddleTest.java} (98%) rename src/test/java/com/wind/java8learn/streamapi/{StreamReduceTest.java => StreamAPIReduceTest.java} (89%) create mode 100644 src/test/java/com/wind/java8learn/streamapi/StreamAPITransactionTest.java delete mode 100644 src/test/java/com/wind/java8learn/streamapi/Test2.java diff --git a/pom.xml b/pom.xml index f293a32..b83b59e 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 e7c1b40..89d3be3 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 0000000..7660831 --- /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 0000000..240efef --- /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 0000000..03b120e --- /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 a884cf2..44c50fe 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 7e50c39..b884e42 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 0000000..70631fa --- /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 0e56d3b..8c3150f 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 5a81365..bd79239 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 0000000..ac2a2a9 --- /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 d781a39..0000000 --- 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 { -} -- Gitee