Java基础——Stream流、File类

一、Stream 流

        1.Stream 流配合Lambda表达式,简化集合和数组操作
        2.Stream 流思想
                1)将数据到流中(获取流对象)
                        ① 集合获取 Stream 流对象,使用 Collection 接口中的默认方法
                             default Stream<E> stream() 获取当前集合对象的 Stream 流
                             例:
                             List<String> list = new ArrayList<String>();
                             list.add("张三丰");
                             list.add("张无忌");
                             list.stream().forEach(s -> System.out.println(s))
                            //Map集合获取Stream流对象, 需要间接获取,- map.entrySet().stream()
                             Map<String, Integer> map = new HashMap<String, Integer>();
                             map.put("张三丰", 100);
                             map.put("张无忌", 35);
                             Set<Map.Entry<String, Integer>> entrySet = map.entrySet();
                             entrySet.stream().forEach(s -> System.out.println(s));
                        ② 数组获取 Stream 流对象,使用 Arrays 数组工具类中的静态方法
                             static <T> Stream<T> stream​(T[] array)将传入的数组封装到 Stream 流对象中
                             例:
                             
int[] arr = {11, 22, 33};
                             Arrays.stream(arr).forEach(s -> System.out.println(s));
                        ⑤ 零散的数据获取 Stream 流对象,使用 Stream 类中的静态方法
                             static <T> Stream<T> of​(T... values)把一堆零散的数据封装到 Stream 流对象中
                             Stream.of(1, 2, 3, 4, 5, 6).forEach(s -> System.out.println(s));

                2)中间方法 - 操作后返回Stream对象, 可以继续操作
                         //示例准备
                         ArrayList<String> list = new ArrayList<>();
                         Collections.addAll(list, "林青霞", "张曼玉", "王祖贤", "柳岩","张敏","张无忌");

                        ① Stream<T> filter(Predicate<? super T> predicate) 用于对流中的数据进行过滤
                            列: list.stream().filter(s -> s.startsWith("张")).filter(s -> s.length() == 3).forEach(
                                    s -> System.out.println(s));//张曼玉,张无忌
                        ② Stream<T> limit(long maxSize) 获取前几个元素
                             列:
                               
 // "林青霞", "张曼玉"
                                list.stream().limit(3).forEach(s -> System.out.println(s));
                        ③ Stream<T> skip(long n) 跳过前几个元素
                                列:
                                // "柳岩","张敏","张无忌"
                                list.stream().skip(3).forEach(s -> System.out.println(s));
                        ④ Stream<T> distinct() 去除流中重复的元素依赖 (hashCode 和 equals方法)
                                列: s3.distinct().forEach(s -> System.out.println(s));
                        ⑤ static <T> Stream<T> concat(Stream a, Stream b) 合并a和b两个流为一个流
                                例:
                                        // 取前4个数据组成一个流
                                        Stream<String> s1 = list.stream().limit(4);
                                        // 跳过2个数据组成一个流
                                        Stream<String> s2 = list.stream().skip(2);
                                        //合并s1和s2得到的流
                                        Stream<String> s3 = Stream.concat(s1, s2);

                注意事项: 流对象已经被使用过就不允许再次使用了.
                3)终结方法
                   Stream流的终结操作方法 - 流水线中的最后一道工序
                   public void forEach (Consumer action) 对此流的每个元素执行遍历操作
                   public long count () 返回此流中的元素数
        3.Stream 收集操作
                把 Stream 流操作后的结果数据转回到集合,Stream 流操作,不会修改数据源
                1)把 Stream 流操作后的结果数据转回到集合
                   R collect​(Collector collector) 开始收集Stream流,指定收集器
                2)Collectors 工具类提供了具体的收集方式
                    public static <T> Collector toList​() 把元素收集到List集合中
                    public static <T> Collector toSet​()把元素收集到Set集合中
                    public static  Collector toMap​(Function keyMapper , Function valueMapper)把元素收
                    集到Map集合中
                例:
                       
//把元素收集到List集合中
                        List<Integer> list1 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10).filter(
                                s -> s % 2 == 0
                        ).collect(Collectors.toList());
                        //把元素收集到List集合中
                       Set<Integer> list2 = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10).filter(
                                s -> s % 2 == 0
                        ).collect(Collectors.toSet());
                        ArrayList<String> list = new ArrayList<>();
                        list.add("张三,23");
                        list.add("李四,24");
                        list.add("王五,25");
                        Map<String, Integer> map = list.stream().filter(new Predicate<String>() {
                                        @Override
                                        public boolean test(String s) {
                                                return Integer.parseInt(s.split(",")[1]) >= 24;
                                        }
                                }).collect(Collectors.toMap(new Function<String, String>() {
                                        @Override
                                        public String apply(String s) {
                                                return s.split(",")[0];
                                        }
                                }, new Function<String, Integer>() {
                                         @Override
                                         public Integer apply(String s) {
                                                  return Integer.parseInt(s.split(",")[1]);
                                        }
                      }));
        例:
                现在有两个 ArrayList 集合,分别存储6名男演员和6名女演员,要求完成如下的操作:
                        男演员只要名字为3个字的前两人
                        女演员只要“小”字开头的,并且不要第一个
                        把过滤后的男演员姓名和女演员姓名合并到一起
                        把上一步操作后的元素作为构造方法的参数创建演员对象,遍历数据
                        演员类MyActor ,里面有一个成员变量,一个带参构造方法,以及成员变量对应的
                        get/set方法
        代码:
                public static void main(String[] args) {
                        ArrayList<String> boy = new ArrayList<>();
                        Collections.addAll(boy, "郭靖", "黄药师", "王祖贤", "乔峰","杨过","张无忌");
                        ArrayList<String> girl = new ArrayList<>();
                        Collections.addAll(girl, "黄蓉", "林超风", "小龙姐", "赵敏","周芷若","小昭");
                        //男演员只要名字为3个字的前两人
                        Stream<String> boy_1 = boy.stream().filter(s -> s.length() == 3).limit(2);
                        //女演员只要“小”字开头的,并且不要第一个
                        Stream<String> girl_1 = girl.stream().filter(s -> s.startsWith("小")).skip(1);
                        //男演员姓名和女演员姓名合并到一起
                        Stream<String> Actor = Stream.concat(boy_1, girl_1);
                        //遍历数据
                        Actor.forEach(new Consumer<String>() {
                                @Override
                                public void accept(String s) {
                                        MyActor A = new MyActor(s);
                                        System.out.println(A);
                                }
                        });
                }
                //演员类MyActor
              
 class MyActor{
                        private String name;
                        public MyActor() {}
                        public MyActor(String name) {
                                this.name = name;
                        }
                        public String getName() {
                                return name;
                        }
                        public void setName(String name) {
                                this.name = name;
                        }
                        public String toString() {
                                return "Actor{name = " + name + "}";
                        }
                }

二、File 类

        File类代表操作系统的文件对象(文件、文件夹)
        构造方法 :
        1. public File (String pathname) : 根据传入的字符串路径封装File对象
                File f = new File("D:\\A.txt");
        2. public File (String parent, String child) : 根据传入的父级路径和子级路径来封装File对象
                File f = new File("D:\\", "test");
        3. public File (File parent, String child) : 根据传入的父级路径(File类型)和子级路径来封装File
             对象
                File f = new File(new File("D:\\"), "test");
                File 对象可以定位文件和文件夹
                File 封装的对象仅仅是一个路径名,这个路径可以是存在的,也可以是不存在的
        路径的写法 :
        1. 绝对路径: 从盘符根目录开始,一直到某个具体的文件或文件夹
        2. 相对路径: 相对于当前项目
        例:
                public static void main(String[] args) throws IOException {
                        File f = new File("src/com/itheima/day12\\A.txt");
                        f.createNewFile();
                }
        常见方法 :
        
1. 判断相关
                public boolean isDirectory() : 判断是否是文件夹
                public boolean isFile() : 判断是否是文件
                public boolean exists() : 判断是否存在
                例:
                File f1 = new File("D:\\A.txt");
                System.out.println(f1.isDirectory()); // false
                System.out.println(f1.isFile()); // true
                System.out.println(f1.exists()); // true

         2. 获取相关
                public long length() : 返回文件的大小(字节数量)
                        * 文件对象操作, 返回正确的字节个数
                        * 文件夹对象操作, 返回的是错误的字节个数
                public String getAbsolutePath() : 返回文件的绝对路径
                public String getPath() : 返回定义文件时使用的路径
                public String getName() : 返回文件的名称,带后缀
                public long lastModified() : 返回文件的最后修改时间(时间毫秒值)
                例:
                
System.out.println(f1.length());
                System.out.println(f1.getAbsolutePath());
                System.out.println(f1.getPath());
                System.out.println(f1.getName());
                System.out.println(new Date(f1.lastModified()));
        3.创建方法和删除方法
                public boolean createNewFile() :创建文件
                public boolean mkdir() : 创建单级文件夹
                public boolean mkdirs() : 创建多级文件夹
                public boolean delete() : 删除文件或文件夹(慎用)
                        - delete 方法删除文件夹, 只能删除空的文件夹.
                 例:
                public static void main(String[] args) throws IOException {
                        File f1 = new File("src\\com\\itheima\\day12\\B.txt");
                        System.out.println(f1.createNewFile());
                        File f2 = new File("src\\com\\itheima\\day12\\aaa");
                        System.out.println(f2.mkdirs());
                        File f3 = new File("src\\com\\itheima\\day12\\C.txt");
                        System.out.println(f3.mkdirs());
                        System.out.println(f1.delete());
                        System.out.println(f2.delete());
                }
        4.遍历方法
                public File[] listFiles() 获取当前目录下所有的 "一级文件对象" 返回 File 数组
                ① 当调用者File表示的路径不存在时,返回null
                ② 当调用者File表示的路径是文件时,返回null
                ③ 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
                ④ 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
                例:
                public static void main(String[] args) {
                        File f = new File("D:\\test");
                        File[] files = f.listFiles();
                        for (File file : files) {
                                System.out.println(file);
                        }
                }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值