JavaSe-2023-2-03 Lambda表达式、Stream流的使用、File类操作文件夹的使用
每日一句: 很多时候,努力并不是为了得到奖赏,而是为了被认同
学习内容:lambda表达式简单的使用、集合流式Stream的操作、File类操作文件
-
Lambda表达式
-
Lambda表达式是JDK1.8的新特性,可以取代大部分的匿名内部类,写出更加优雅的Java代码尤其是集合的遍历和其他集合操作中,可以极大的优化代码结构!
-
JDK也提供了大量的内置函数接口供我们使用,使用Lambda表达式运用更加方便、高效
-
对接口的要求
-
虽然使用Lambda表达式可以对某些接口进行简单的实现,但并不是所有的接口可以使用Lambda表达式来实现,Lambda表达式规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法
-
public static void main(String[] args) { Test t= new Test() { @Override public int test() { return 2; } }; t.test(); //使用新特性 Test t1 = () -> 2; System.out.println(t1.test()); Test1 t2 = (x) -> x*2; System.out.println(t2.test(5)); /*定义一个接口 返回两个参数和*/ Test3 t3= (x, y) -> x + y; System.out.println(t3.test(2,3)); } interface Test{ int test(); } interface Test1{ int test(int x); } // Lambda 规定接口中只能有一个需要被实现的方法,不是规定接口中只能有一个方法 interface Test3{ int test(int x,int y); // 我们还可以定义默认方法 default int sum(){ return 0; } }
-
-
@Functionallnterface
- 修饰函数式接口的,要求接口中的抽象方法只能有一个,这个注解往往和Lambda表达式一起出现.
-
Lambda基本语法
-
public class TestLambda02 { public static void main(String[] args) { //无参数无返回值 A1 a1 = ()->{ System.out.println("Lamdba无参数无返回值"); }; //有参数无返回值 A2 a2 = name -> { System.out.println(name+"你好"); }; a2.a("李四"); //无参数有返回值 A3 a3 = ()->{ return true; }; System.out.println(a3.a()); //有参数有返回值 A4 a4 = name->{ return 0; }; System.out.println(a4.a("张三")); } } //该注解会检查接口是否满足函数式接口 @FunctionalInterface interface A1{ void a(); default int t(){ return 0; } } @FunctionalInterface interface A2{ void a(String name); } @FunctionalInterface interface A3{ boolean a(); } @FunctionalInterface interface A4{ int a(String name); }
-
-
Lambda语法简化
-
public class TestLambda03 { public static void main(String[] args) { // 参数类型如果可以推断,可以省略,多个参数应该一起被省略 B1 b = x->{ System.out.println("省略了参数类型"); }; B2 b2 = x ->{ System.out.println("如果只有一个参数,则小括号可以省略"); }; B3 b3 = () -> System.out.println("如果方法体中只有一行代码,则大括号可以省略"); B4 b4 = x -> x*2; //方法体只有一行代码,如果有return,则大括号可以省略 } } interface B1{ void b(int x); } interface B2{ void b(int a); } interface B3{ void b(); } interface B4{ int b(int x); }
-
-
-
Stream流的使用
-
Stream流操作是Java8提供一个重要新特性,它允许开发人员以声明性方式处理集合,其核心类库主要是改进了对集合类的API和新增Stream操作。能够使代码更加的简洁,极大地简化了集合的处理操作,提高了开发的效率和生产力。
-
public static void main(String[] args) { List<String> list = new ArrayList<>(); Collections.addAll(list,"张无忌","张三丰","金毛狮王","张译"); // 找出所有姓张的长度为3的名字 for (String lists:list) { if(lists.length() == 3 && lists.substring(0,1).equals("张")){ System.out.println(lists); } } // 使用stream流式 //获取流 //1 forEach()遍历 // ::方法的引用 list.stream().forEach(System.out::println); //第二种方式 list.stream().forEach(s -> System.out.println(s)); //2 long count(); 统计 long count = list.stream().count(); System.out.println(count); //3 filter() 用于过滤数据 list.stream() .filter(str->str.startsWith("张")) .filter(str->str.length() == 3) .forEach(System.out::println); //4 map() 将流中的元素映射到另外一个流中 List<String> list2 = new ArrayList<>(); Collections.addAll(list2,"1","12","12","123"); //list2.stream().map(str>Integer.parseInt(str)) // .forEach(System.out::println); list2.stream().map(Integer::parseInt).forEach(System.out::println); //5 sorted(); 对流中数据进行排序 list2.stream().sorted().forEach(System.out::println); //自定义排序 list2.stream().map(Integer::parseInt).sorted((a,b)->a-b).forEach(System.out::println); //去重 distinct() list2.stream().distinct().forEach(System.out::println);
-
Steam的方法使用
-
-
File类
-
Java.io.File类:文件和文件目录路径的抽象表示形式
- File类中涉及到了关于文件或者文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或者读取文件内容的操作,如果需要读取或者写入文件内容,必须使用IO流
-
File的使用
-
绝对路径(是一个固定的路径,从盘符开始) 和 相对路径(是相对于某个位置开始)
-
路径分隔符
- 路径中每一级之间用一个路径分隔符分开
- 路径分隔符和系统有关: win和dos系统默认"" URL使用"/"来表示
-
常用构造器
-
构造器 描述 public File(String pathname) 以 pathname
为路径创建File
对象,可以是绝对路径或者相对路径,如果pathname
是相对路径,则默认的当前路径在系统属性user.dir
中存储。public File(String parent,String child) 以 parent
为父路径,child
为子路径创建File对象。public File(File parent,String child) 根据一个父 File
对象和子文件路径创建File
对象 -
常用方法
-
判断功能
-
方法 描述 public boolean isDirectory() 判断是否是文件目录 public boolean isFile() 判断是否是文件 public boolean exists() 判断是否存在 public boolean canRead() 判断是否可读 public boolean canWrite() 判断是否可写 public boolean isHidden() 判断是否隐藏
-
-
获取功能
-
方法 描述 public String getAbsolutePath() 获取绝对路径 public String getPath() 获取路径 public String getName() 获取名称 public String getParent() 获取上层文件目录路径。若无,返回 null
public long length() 获取文件长度(即:字节数)。不能获取目录的长度。 public long lastModified() 获取最后一次的修改时间,毫秒值 public String[] list() 获取指定目录下的所有文件或者文件目录的字符串数组 public File[] listFiles() 获取指定目录下的所有文件或者文件目录的File对象数组 public boolean renameTo(File dest) 把文件重命名为指定的文件路径
-
-
代码实现
public static void main(String[] args) { File file = new File("src/com/shoot/po"); if(file.isDirectory()){ // listFiles(); 将当前目录下的文件或者文件夹以数组的形式返回 File[] files = file.listFiles(); //返回java文件 for (File f:files) { if(f.isFile() && f.getName().endsWith("java")){ System.out.println(f.getName()); } } //FileFilter:文件过滤器 满足accept方法才能够进入到数组当中 File[] files1 = file.listFiles(new FileFilter() { @Override public boolean accept(File f) { return f.isFile() && f.getName().endsWith("java"); } }); for (File f:files1) { System.out.println(f.getName()); }
}
-
-
文件夹删除 代码实现
-
public static void main(String[] args) { File file = new File("E:\\abc"); if (file.isDirectory()){ deleteFile(file); System.out.println("删除成功"); } } private static void deleteFile(File file) { //获取当前目录下的所有文件和文件夹 File[] files = file.listFiles(); //是文件直接删除 for (File f:files) { if(f.isFile()){ //是文件夹的话直接调用方法删除 f.delete(); }else{ deleteFile(f); } } //删除当前目录 file.delete(); }
-
-
-
-
新手上路,以上内容仅供参考,如有不对的地方,望指出!
-
gitee代码仓库地址:https://gitee.com/Zhengsenbing/java-se-basic