章节6-Stream流 & File类

101 阅读3分钟

Stream流

获取Stream流对象

  • 集合获取Stream流对象 (使用 Collection 接口中的默认方法)

  • @Test
        public void test01() {
            //Collection集合获取
            Collection<String> collection = new ArrayList<>();
            collection.add("张三");
            collection.add("李四");
            collection.add("王五");
            collection.add("赵六");
            collection.add("钱七");
    
            Stream<String> streamColl = collection.stream();
            streamColl.forEach(item -> System.out.println(item));
    
            //Map集合获取
            Map<Integer, String> map = new HashMap<>();
            map.put(1, "zhangsan");
            map.put(2, "zhangsan");
            map.put(3, "zhangsan");
            map.put(4, "zhangsan");
            map.put(5, "zhangsan");
    
            Set<Map.Entry<Integer, String>> entries = map.entrySet();
    
            Stream<Map.Entry<Integer, String>> streamMap = entries.stream();
            streamMap.forEach(item -> System.out.println(item));
        }
    
  • 数组获取Stream流对象 (使用 Arrays 数组工具类中的静态方法)

  • @Test
    public void test02() {
        Integer[] integers = {1, 2, 3, 4};
        Stream<Integer> streamArr = Arrays.stream(integers);
        streamArr.forEach(item -> System.out.println(item));
    }
    
  • 零散数据获取Stream流对象 (使用 Stream 类中的静态方法)

  • @Test
    public void test03() {
        Stream<String> stringStream = Stream.of("张无忌", "张良", "王二麻子", "谢广坤", "张三丰", "张翠山");
        //获取姓张且名字为三个字的姓名
        /**
         * Stream<T> filter(Predicate<? super T> predicate);
         * 方法返回值为Stream对象
         */
        stringStream.filter(item -> item.length() == 3).filter(item -> item.startsWith("张")).forEach(item -> System.out.println(item));
    }
    

Stream 流中间操作方法

  • ==注:== 中间方法返回都是Stream流对象, 即支持链式编程

  • Stream filter (Predicate<? super T> predicate) 用于对流中的数据进行过滤

  • Stream limit(long maxSize) 获取前几个元素

  • Stream skip(long n) 跳过前几个元素

  • Stream distinct() 去除流中重复的元素依赖 (hashCode 和 equals方法)

  • static Stream concat(Stream a, Stream b) 合并a和b两个流为一个流

Stream 流的注意事项

  • 如果流对象被消费过(只能使用一次),就不能再使用了, 若需要只能再次创建

  • // 需求1:取前4个数据组成一个流
    Stream<String> stream1 = list.stream().limit(4);
    //需求2:跳过2个数据组成一个流
    Stream<String> stream2 = list.stream().skip(2);
    // 需求3:合并需求1和需求2得到的流,并把结果在控制台输出
    Stream.concat(stream1,stream2).forEach(item-> System.out.println(item));
    System.out.println("===========");
    // 需求4:合并需求1和需求2得到的流,并把结果在控制台输出,要求字符串元素不能重复
    Stream.concat(list.stream().limit(4),list.stream().skip(2)).distinct().forEach(item-> System.out.println(item));
    

Stream 收集操作

  • 把 Stream 流操作后的结果数据转回到集合

  • Stream 流操作,不会修改数据源

  • R collect(Collector collector)开始收集Stream流,指定收集器

    • public static Collector toList() 把元素收集到List集合中

    • List<Integer> list1 = list.stream().filter(item -> item % 2 == 0).collect(Collectors.toList());
      
    • public static Collector toSet() 把元素收集到Set集合中

    • Set<Integer> set = list.stream().filter(item -> item % 2 == 0).collect(Collectors.toSet());
      
    • public static Collector toMap(Function keyMapper , Function valueMapper) 把元素收集到Map集合中

    • /**
       * 创建一个ArrayList集合,并添加以下字符串。字符串中前面是姓名,后面是年龄
       * "zhangsan,23"
       * "lisi,24"
       * "wangwu,25"
       * 保留年龄大于等于24岁的人,并将结果收集到Map集合中,姓名为键,年龄为值
       */
      @Test
      public void test02() {
          ArrayList<String> list = new ArrayList<>();
          list.add("zhangsan,23");
          list.add("lisi,24");
          list.add("wangwu,25");
      
          Map<String, Integer> map = list.stream().filter(item -> Integer.parseInt(item.split(",")[1]) >= 24).collect(Collectors.toMap(new Function<String, String>() {
              @Override
              public String apply(String item) {
                  return item.split(",")[0];
              }
          }, new Function<String, Integer>() {
              @Override
              public Integer apply(String item) {
                  return Integer.parseInt(item.split(",")[1]);
              }
          }));
      
          System.out.println(map);
      }
      

File类

  • 概念 : File类代表操作系统的文件对象(文件、文件夹)

File 类创建对象

  • image-20241215205954654.png

File 类常用方法

  • public boolean isDirectory()判断此路径名表示的File是否为文件夹
    public boolean isFile()判断此路径名表示的File是否为文件
    public boolean exists()判断此路径名表示的File是否存在
    public long length()返回文件的大小(字节数量)
    public String getAbsolutePath()返回文件的绝对路径
    public String getPath()返回定义文件时使用的路径
    public String getName()返回文件的名称,带后缀
    public long lastModified()返回文件的最后修改时间(时间毫秒值)

File 类的创建和删除方法

  • 创建

    • public boolean createNewFile()创建一个新的空的文件
      public boolean mkdir()只能创建一级文件夹
      public boolean mkdirs()可以创建多级文件夹
  • 删除

    • public boolean delete()删除由此抽象路径名表示的文件或空文件夹
    • ==注:== delete() 方法只能删除空文件夹,且不走回收站

File 类的遍历方法

  • public File[] listFiles()获取当前目录下所有的 “一级文件对象” 返回 File 数组
  • 案例

  • /**
     * 需求:键盘录入一个文件夹路径,找出这个文件夹下所有的 .java 文件
     */
    @Test
    public void test01() {
        File dir = FileDemo01.getDir();
        printFile(dir);
    }
    
    private void printFile(File dir) {
        File[] files = dir.listFiles();
    
        for (File file : files) {
            if (file.isFile() && file.getName().endsWith(".exe")) {
                System.out.println(file);
            } else {
                if (file.listFiles() != null) {
                    printFile(file);
                }
            }
        }
    }