JAVA进阶-stream流,file,io流

day08-stream流,file,io流

体验Stream流

  • 需求:按照下面的要求完成集合的创建和遍历

    • 创建一个集合,存储多个字符串元素
    • 把集合中所有以“张”开头的元素存储到一个新的集合
    • 把”张“开头的集合中的长度为3的元素存储到一个新的集合
    • 遍历上一步得到集合
    • image-20220622162721331
    • image-20220622181737335
  • Stream流的三类方法

    • 获取Stream流
      • 创建一条流水线,并把数据放到流水线上准备进行操作
    • 中间方法
      • 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作
    • 终结方法
      • 一个Streamm流只能有一个终结方法。是流水线上的最后一个操作
  • Stream流的获取方法

    • 单列集合

      • //可以使用Collection接口中的默认方法stream()生成流
        default Stream<E> streamm()
        
    • 双列集合

      • 间接的生成流
      • 可以先通过keySet或者entrySet获取一个Set集合,再获取Stream流
    • 数组

      • Arrays中的静态方法stream生成流
    • 同种数据类型的多个数据

      • 1,2,3,4,5...
        "aaa","bbb","ccc"...
        //使用Stream.of(T...values)生成流
        
    • 案例

      • package com.day08;
        
        import java.util.ArrayList;
        import java.util.Arrays;
        import java.util.HashMap;
        import java.util.stream.Stream;
        
        /**
         * 单列集合:集合对象.stream()
         * 双列集合:不能直接获取,需要间接获取
         *             集合对象.keySet().stream();
         *             集合对象.entrySet.stream();
         * 数组:     Arrays.stream(数组名);
         * 同种数据类型的多个数据:
         *           Stream.of(数据1,数据2,数据3...);
         */
        public class MyStream2 {
            public static void main(String[] args) {
                //单列集合
                method1();
        
                //双列集合
                method2();
        
                //数组
                method3();
        
                //同种数据类型的多个数据
                method4();
        
            }
        
            private static void method4() {
                //同种数据类型的多个数据
                Stream.of(1,2,3,4,5,6,7,8).forEach(s-> System.out.println(s));
            }
        
            private static void method3() {
                //数组
                int[] arr = {1,2,3,4,5};
                Arrays.stream(arr).forEach(s-> System.out.println(s));
            }
        
            private static void method2() {
                //双列集合
                HashMap<String,Integer> map = new HashMap<>();
                map.put("aaa",1);
                map.put("bbb",2);
                map.put("ccc",3);
                //双列集合不能直接获取Stream流
                //keySet
                //先获取到所有的键
                //再把这个Set集合中所有的键放到Stream流中
                map.keySet().stream().forEach(s-> System.out.println(s));
                //entrySet
                //先获取所有的键值对对象
                //再把这个set集合中所有的键值对对象放到stream流中
                map.entrySet().stream().forEach(s-> System.out.println(s));
            }
        
            private static void method1() {
                //单列集合
                ArrayList<String> list = new ArrayList<>();
                list.add("aaa");
                list.add("bbb");
                list.add("ccc");
        
                Stream<String> stream = list.stream();
                stream.forEach(s-> System.out.println(s));
            }
        }
        
        
Stream流的常见中间操作方法
  • image-20220622185017474

    • package com.day09;
      
      import java.util.ArrayList;
      import java.util.function.Predicate;
      
      public class MySteram3 {
          public static void main(String[] args) {
              ArrayList<String> list = new ArrayList<>();
              list.add("张三丰");
              list.add("张无忌");
              list.add("老六");
      
      
              //filter方法中获取流中的每一个数据。
              //而test方法中的s,就依次表示流中的每一个数据。
              //我们只要在test方法中对s进行判断就可以了
              //结果为true就保留当前数据
              list.stream().filter(new Predicate<String>() {
                  @Override
                  public boolean test(String s) {
                      boolean result = s.startsWith("张");
                      return result;
                  }
              }).forEach(s-> System.out.println(s));
      
              //因为Predicate接口中只有一个抽象方法test
              //所以我们可以使用lambda表达式来简化
              list.stream().filter((String s)->{
                  boolean result = s.startsWith("张");
                  return result;
              }).forEach(s-> System.out.println(s));
              
              
                //简化
              list.stream().filter(s-> s.startsWith("张")).forEach(s-> System.out.println(s));
          }
      }
      
      
  • image-20220622190331930

    • package com.day09;
      
      import java.util.ArrayList;
      import java.util.stream.Stream;
      
      public class MyStream4 {
          public static void main(String[] args) {
              ArrayList<String> list = new ArrayList<>();
              list.add("张三丰");
              list.add("张三丰");
              list.add("张无忌");
              list.add("老六");
      
              //limit(long maxSize):截取指定参数个数的数据
              list.stream().limit(2).forEach(s-> System.out.println(s));
      
              //skip(long n):跳过指定参数个数的数据
              list.stream().skip(2).forEach(s-> System.out.println(s));
      
              //static<T> Stream<T> concat(Stream a,Stream b):合并a和b两个流为一个流
              ArrayList<String> list2 = new ArrayList<>();
              list2.add("张三丰");
              list2.add("张无忌");
              list2.add("老六");
      //        Stream<String> stream1 = list.stream();
      //        Stream<String> stream2 = list2.stream();
      //        Stream<String> stringStream = Stream.concat(stream1, stream2);
      //        stringStream.forEach(s-> System.out.println(s));
      		//简化
              Stream.concat(list.stream(),list2.stream()).forEach(s-> System.out.println(s));
      
              //distinct():去除流中重复的元素。依赖(hashCode和equals方法)
              list.stream().distinct().forEach(s-> System.out.println(s));
      
      
          }
      }
      
      
Stream流的常见终结操作方法
  • image-20220622191414244
    • image-20220622191544607
    • image-20220622191741209
Stream流的收集操作
  • image-20220622191916902

    • package com.day09;
      
      import java.util.ArrayList;
      
      public class MyStream5 {
          public static void main(String[] args) {
              ArrayList<Integer> list = new ArrayList<>();
              for (int i = 0; i < 10; i++) {
                  list.add(i);
              }
              list.stream().filter(
                      number->number%2==0
              ).forEach(number-> System.out.println(number));
      
              System.out.println("---------------------");
              for (Integer integer : list) {
                  System.out.println(integer);
              }
          }
      }
      
      
    • 结论:在Stream流中无法直接修改集合,数组等数据源中的数据

Stream流的收集操作
  • Stream流的收集方法

    • R collect(Cllector collector)
      
    • image-20220622192935960

    • image-20220622193158620

练习
  • image-20220622193319456

File和IO流

File
  • image-20220622194237818

  • 绝对路径和相对路径

    • image-20220622194724497
  • File类创建功能

    • image-20220622194926321
    • image-20220622195100717
    • image-20220622195357801
    • image-20220622195406723
  • File删除功能

    • image-20220622195536600
    • image-20220622195733133
  • File类判断和获取功能

    • image-20220622195814874
  • File类高级获取功能

    • image-20220622200900833

    • File file1 = new File("D:\\");
         File[] files = file1.listFiles();//返回值是一个File类型的数组
         for (File path : files) {
             System.out.println(path);
         }
      
    • image-20220622202219484

递归删除文件夹
  • package com.day09.filedemo;
    
    import java.io.File;
    import java.io.IOException;
    
    public class FileDemo2 {
        public static void main(String[] args) throws IOException {
            //删除一个多级文件夹
            //delete方法
            //只能删除文件和空文件夹
            File file = new File("D:\\test");
            deleteDir(file);
        }
        private static void deleteDir(File file) {
            //先删除文件夹里面的内容,再删除这个文件夹
            //递归
            //注意:可以解决所有文件夹和递归相结合的题目
            //1.进入---得到当前文件夹里面所有内容的File对象.
            File[] files = file.listFiles();
            //2.遍历---因为我想得到 文件夹里面的每一个文件和文件夹的File对象
            for (File file1 : files) {
                if(file1.isFile()){
                    //3.判断---如果遍历的File对象是一个文件则直接删除
                    file1.delete();
                }else{
                    //4.判断
                    //如果是文件夹则递归
                    deleteDir(file1);//参数一定要是 当前文件夹里面的文件夹File对象
                }
            }
            //最后删除这个文件夹
            file.delete();
        }
    }
    
    
统计文件夹出现的次数
  • image-20220622212528046

  • package com.day09.filedemo;
    
    import java.io.File;
    import java.util.HashMap;
    
    public class FileDemo3 {
        public static void main(String[] args) {
            File file = new File("itheima-oop-polymorphic");
            HashMap<String,Integer> hm = new HashMap<>();
    
            getCount(hm,file);
            System.out.println(hm);
        }
    
        private static void getCount(HashMap<String, Integer> hm, File file) {
            File[] files = file.listFiles();
            for(File f:files){
                if(f.isFile()){
                    String fileName = f.getName();
                    String[] fileNameArr = fileName.split("\\.");
                    if(fileNameArr.length ==2){
                        String fileEndName = fileNameArr[1];
                        if(hm.containsKey(fileEndName)){
                            //已经存在
                            //将已经出现的次数获取出来
                            Integer count = hm.get(fileEndName);
                            //这种文件又出现了一次
                            count++;
                            //把已经出现的次数给覆盖掉
                            hm.put(fileEndName,count);
                        }else {
                            //不存在
                            //表示当前文件第一次出现
                            hm.put(fileEndName,1);
                        }
                    }
                }else {
                    getCount(hm, f);
                }
            }
        }
    }
    
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值