|
@@ -0,0 +1,196 @@
|
|
|
|
+package com.sf.day25._01_stream;
|
|
|
|
+
|
|
|
|
+import org.junit.Test;
|
|
|
|
+
|
|
|
|
+import java.util.*;
|
|
|
|
+import java.util.stream.Collectors;
|
|
|
|
+
|
|
|
|
+public class StreamTest {
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void test(){
|
|
|
|
+ // 1 创建出来一个结合
|
|
|
|
+ List<Integer> list = Arrays.asList(1, 2,3,4, 4, 3,11,9, 5,7,8,9);
|
|
|
|
+ // 2 获取stream 流
|
|
|
|
+ // 3 想要把集合当中每一个元素的值都加5
|
|
|
|
+ list.stream().
|
|
|
|
+ filter(e -> e>3).
|
|
|
|
+ distinct(). // 去重
|
|
|
|
+ limit(5). // 保留3条数据
|
|
|
|
+ skip(1). // 跳过几个元素
|
|
|
|
+ map(e -> e+5 ). // 对于我们元素进行额外处理
|
|
|
|
+ sorted((o1, o2) -> o2-o1). // 如果想要从小到大排序直接调用sorted 如果想要从大到小进行排序需要传入比较器
|
|
|
|
+ forEach(System.out::println);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void test1(){
|
|
|
|
+ /**
|
|
|
|
+ * 定义一个集合 1,5,5,4,3,2,1,
|
|
|
|
+ * 1要求进行去重
|
|
|
|
+ * 2要求过滤大于3
|
|
|
|
+ * 3最后求一共有多个大于3的元素 , 总数量
|
|
|
|
+ * 4求最大值 和最小值
|
|
|
|
+ */
|
|
|
|
+// List<Integer> list = Arrays.asList(1, 5, 5, 4, 3, 2, 1);
|
|
|
|
+// List<Integer> list1 = new ArrayList<>();
|
|
|
|
+// list.stream().
|
|
|
|
+// distinct().
|
|
|
|
+// filter(e-> e>3).
|
|
|
|
+// forEach(e-> list1.add(e));
|
|
|
|
+// System.out.println("总数量:"+ list1.size());
|
|
|
|
+// System.out.println("最大值:"+Collections.max(list1));
|
|
|
|
+// System.out.println("最小值:"+ Collections.min(list1));
|
|
|
|
+
|
|
|
|
+ List<Integer> list = Arrays.asList(1, 5, 5, 4, 3, 2, 1);
|
|
|
|
+ // option 是jdk8 提供一个类
|
|
|
|
+ // 他封装了我们想要数据, 如果你想要拿到我们数据,需要调用get 方法
|
|
|
|
+ Optional<Integer> optional = list.stream().
|
|
|
|
+ distinct().
|
|
|
|
+ filter(e -> e > 3). //中间操作
|
|
|
|
+ // 注意终止操作要在中间操作后面
|
|
|
|
+// count(); // 总数量
|
|
|
|
+// max((o1, o2) -> o1 - o2); 自己传入比较器
|
|
|
|
+ // 这里Comparator.naturalOrder() 返回比较器,用的升序排序 ,如果要降序还是要自己传入比较器
|
|
|
|
+// max(Comparator.naturalOrder());
|
|
|
|
+// min(Comparator.naturalOrder()); // jdk 8 当中提供新的方法返回自然排序比较器
|
|
|
|
+ min(Integer::compareTo); // 包装类当中提供一个方法返回一个比较器
|
|
|
|
+// System.out.println("总数量:"+ count);
|
|
|
|
+// System.out.println("最大值:"+ optional.get());
|
|
|
|
+ // 使用option封装数据有什么好处呢 , 他提供一个方法ifPresent 判断数据是否存在 如果存在在获取数据
|
|
|
|
+ System.out.println("最小值:"+ optional.get());
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 总结: 针对基本类型的比较求最大值和最小值写法一共有三种方式
|
|
|
|
+ * max((o1, o2) -> o1 - o2); 自己传入比较器, 写比较规则
|
|
|
|
+ * max(Comparator.naturalOrder()); jdk8 提供新方法,返回自然排序比较器
|
|
|
|
+ * min(Integer::compareTo); 包装类当中提供方法返回自然排序比较器 从小到大进行排序
|
|
|
|
+ * 自己选择一种去记
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void test2(){
|
|
|
|
+ // 需求:
|
|
|
|
+ // 如果是华为手机折扣要打8折, 如果是苹果手机打9折扣 map
|
|
|
|
+ // 实战需求:获取产品列表中价格最高的产品 使用stream 流当中max 方法实现
|
|
|
|
+ // List<Product> list (id,name,price) 要求在静态代码框中完成初始化
|
|
|
|
+ Optional<Product> optional = Product.datas.stream().
|
|
|
|
+ map(e -> {
|
|
|
|
+ // 判断如果e.getName 是苹果打9折 如果是华为就打8折
|
|
|
|
+ double price;
|
|
|
|
+ if (e.getName().contains("苹果")) {
|
|
|
|
+ price = e.getPrice() * 0.9;
|
|
|
|
+ } else if (e.getName().contains("华为")) {
|
|
|
|
+ price = e.getPrice() * 0.8;
|
|
|
|
+ } else {
|
|
|
|
+ price = e.getPrice();
|
|
|
|
+ }
|
|
|
|
+ e.setPrice(price);
|
|
|
|
+ return e;
|
|
|
|
+ }).max((o1, o2) -> o1.getPrice().intValue() - o2.getPrice().intValue());
|
|
|
|
+ System.out.println(optional.get());
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void test3() {
|
|
|
|
+ // 需求:
|
|
|
|
+ // 如果是华为手机折扣要打8折, 如果是苹果手机打9折扣 map
|
|
|
|
+ // List<Product> list (id,name,price) 要求在静态代码框中完成初始化
|
|
|
|
+ // 要求把数据最终存到List ,Set
|
|
|
|
+ List<Product> list = new ArrayList<>();
|
|
|
|
+ Set<Product> set = new HashSet<>();
|
|
|
|
+ Set<Product> list1 = Product.datas.stream().
|
|
|
|
+ map(e -> {
|
|
|
|
+ // 判断如果e.getName 是苹果打9折 如果是华为就打8折
|
|
|
|
+ double price;
|
|
|
|
+ if (e.getName().contains("苹果")) {
|
|
|
|
+ price = e.getPrice() * 0.9;
|
|
|
|
+ } else if (e.getName().contains("华为")) {
|
|
|
|
+ price = e.getPrice() * 0.8;
|
|
|
|
+ } else {
|
|
|
|
+ price = e.getPrice();
|
|
|
|
+ }
|
|
|
|
+ e.setPrice(price);
|
|
|
|
+ return e;
|
|
|
|
+ }).collect(Collectors.toSet());
|
|
|
|
+ System.out.println(list1);
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void test4(){
|
|
|
|
+ // 需求2 : List<Integer> {1,2,3,4,5,6}
|
|
|
|
+ // 要求过滤大于3的
|
|
|
|
+ // 保留2个
|
|
|
|
+ // 要求最终把数据放到一个map<Integer,Integer> 中
|
|
|
|
+ // 4 16
|
|
|
|
+ // 5 25
|
|
|
|
+ //
|
|
|
|
+ List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6);
|
|
|
|
+ Map<Integer, Integer> map = list.stream().
|
|
|
|
+ filter(e -> e > 3).
|
|
|
|
+ limit(2).collect(Collectors.toMap(e -> e, e -> e * e));
|
|
|
|
+ System.out.println(map);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 需求: List<Integer> {1,2,5,3,4,5,6}
|
|
|
|
+ * 要求 求出集合当中4 5 6 的总和和平均值 第一第二第三大的元素 具体怎么找到4 5 6 自己想办法
|
|
|
|
+ * 要求求平均值和总和
|
|
|
|
+ */
|
|
|
|
+ @Test
|
|
|
|
+ public void test5(){
|
|
|
|
+ List<Integer> list = Arrays.asList(1, 2, 5, 3, 4, 5, 6);
|
|
|
|
+ // 定义综合
|
|
|
|
+// Integer count = 0;
|
|
|
|
+//
|
|
|
|
+// // 集合数据进行去重, 并且排序, 并且放到新的集合中
|
|
|
|
+// List<Integer> list1 = list.stream().
|
|
|
|
+// distinct().
|
|
|
|
+// sorted((o1, o2) -> o2 - o1).collect(Collectors.toList());
|
|
|
|
+// // 遍历新的集合判断小于3 求和
|
|
|
|
+// for (int i = 0; i < list1.size(); i++) {
|
|
|
|
+// if(i<3){
|
|
|
|
+// count += list1.get(i);
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// System.out.println(count);
|
|
|
|
+// System.out.println(count/3);
|
|
|
|
+ // 最开始求4,5,6 4平方 + 5平方+ 6平方
|
|
|
|
+ Integer count = list.stream().
|
|
|
|
+ distinct().
|
|
|
|
+ sorted((o1, o2) -> o2 - o1).
|
|
|
|
+ limit(3).
|
|
|
|
+// map(e-> e*e).
|
|
|
|
+ collect(Collectors.summingInt(e -> e*e));
|
|
|
|
+ System.out.println(count);
|
|
|
|
+
|
|
|
|
+// Double dou = list.stream().
|
|
|
|
+// distinct().
|
|
|
|
+// sorted((o1, o2) -> o2 - o1).
|
|
|
|
+// limit(3).
|
|
|
|
+// collect(Collectors.averagingInt(e -> e));
|
|
|
|
+// System.out.println(dou);
|
|
|
|
+// collect(Collectors.summingInt(e -> e));
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ @Test
|
|
|
|
+ public void test6(){
|
|
|
|
+ Product product = new Product();
|
|
|
|
+ // 这里有个问题现在我们又两个方法 , 我们怎么知道那个是新的方法, 那个是旧的方法呢已经过时了呢
|
|
|
|
+ // 你如果提供Deprecated 他就会在方法上加上一个 --- 表示已经过期了
|
|
|
|
+ // 这个注解的作用 , 程序检索到以后标记---
|
|
|
|
+ /**
|
|
|
|
+ * 每一个注解作用都是不一样的, 我们学习到时候需要学习每一个注解都有什么作用
|
|
|
|
+ * @Getter 提供get 方法的 @Test 提供junit测试 Deprecated 标记方法过时的
|
|
|
|
+ */
|
|
|
|
+ product.eat();
|
|
|
|
+
|
|
|
|
+ }
|
|
|
|
+}
|