文章目录
一、Lambda表达式
1、函数式编程思想概述
面向对象过分强调“必须通过对象的形式来做事情”;
函数式思想则尽量忽略面向对象的复杂语法——强调做什么,而不是以什么形式做。
2、lambda表达式简化实现冗余的Runnable代码
需求:启动一个线程,在控制台输出一句话:多线程程序启动了
- 方式一:实现类的方式实现需求
方式二:匿名内部类的方式实现
方式三:Lambda表达式的方式实现
public class LambdaDemo {
public static void main(String[] args) {
// Lambda表达式的方式实现
new Thread(() -> {
System.out.println("多线程程序启动了");
}).start();
}
}
3、lambda表达式的标准格式
形式参数是指接口中抽象方法的参数列表
4、练习
Lambda表达式的使用前提:
- 有一个接口
- 接口中有且仅有一个抽象方法
抽象方法无参无返回值
抽象方法带参无返回值
抽象方法带参有返回值
5、lambda省略格式
省略规则:
- 如果抽象方法的参数有且就有一个,参数类型可以省略;但是如果抽象方法有多个参数的话,不能只省略一个参数类型;
- 如果参数有且仅有一个,那么小括号可以省略;
- 如果抽象方法的代码块的语句只有一条,可以省略大括号和分号,如果还有return,return必须要省略掉
// Addable接口:
public interface Addable {
int add(int x, int y);
}
// Flyable接口:
public interface Flyable {
void fly(String s);
}
// 演示类:
public class LambdaDemo01 {
public static void main(String[] args) {
// 没省略的lambda表达式
useAddable((int x, int y) -> {
return x + y;
});
// 省略参数类型,但不能只省略一个
useAddable((x, y) -> {
return x + y;
});
// 抽象方法只有一条语句,可省略大括号,分号,return必须省略
useAddable((x, y) -> x + y);
useFlyable(s -> System.out.println(s)); // 参数只有一个,小括号可以省略
}
private static void useAddable(Addable a) {
int sum = a.add(10, 20);
System.out.println(sum);
}
private static void useFlyable(Flyable f) {
f.fly("......");
}
}
6、lambda表达式的注意事项
- 使用lambda必须要有接口,并且接口中有且仅有一个抽象方法(有且仅有一个抽象方法的接口,被称为函数式接口)
- 使用lambda表达式必须要有上下文环境,这样才能推导出lambda对应的接口
7、lambda和匿名内部类的区别
二、File类
1、File类介绍
java.io.File类:文件和目录路径名的抽象表示形式,主要用于文件和目录的创建、查找和删除等操作。
- Java把电脑中的文件和文件夹(目录)封装为了一个File类,我们可以使用File类对文件和文件夹进行操作
- File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
- 可以使用File类的方法:创建一个文件/文件夹;删除文件/文件夹;获取文件/文件夹;判断文件/文件夹是否存在;对文件夹进行遍历;获取文件的大小。
2、File类的静态成员变量
static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static char pathSeparatorChar 与系统有关的路径分隔符。
static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
static char separatorChar 与系统有关的默认名称分隔符。
区分:
String pathSeparator = File.pathSeparator;
System.out.println(pathSeparator); // 路径分隔符 windows:分号; linux:冒号:
String separator = File.separator;
System.out.println(separator); // 文件名称分隔符 windows:反斜杠\ linux:正斜杠/
以后在操作路径时,要特别注意不同操作系统
windows操作系统下 —— C:\develop\a\a.txt
linux操作系统下 —— C:/develop/a/a.txt
“C:” + File.separator + “develop” + File.separator + “a” + File.separator + “a.txt” // 用File.separator来获取不同操作系统的文件名称分隔符
3、绝对路径与相对路径
- 绝对路径:是一个完整的路径,以盘符开始的路径。例如:
A:\\IdeaProject\\advance-code\\day08-code-File类
- 相对路径:是一个简化的路径,相当于当前项目的根目录。
123.txt(可以省略项目的根目录)
注意:
- 路径是不区分大小写的
- 路径中的【文件名称分隔符】在windows里使用反斜杠,反斜杠是转义字符,两个反斜杠代表一个普通的反斜杠
4、File类的构造方法
File(String pathname)
: 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
参数:String pathname : 字符串的路径名称
路径可以是以文件结尾, 也可以是以文件夹结尾
路径可以是相对路径, 也可以是绝对路径
路径可以是存在, 也可以是不存在
创建File对象, 只是把字符串路径封装为File对象, 不考虑路径的真假情况
File(String parent, String child)
: 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
参数:把路径分成了两部分
String parent:父路径
String child:子路径
好处:父路径和子路径, 可以单独书写, 使用起来非常灵活; 父路径和子路径都可以变化
File(File parent, String child)
:根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
参数:把路径分成了两部分
File parent:父路径
String child:子路径
好处:父路径和子路径,可以单独书写,使用起来非常灵活;父路径和子路径都可以变化;
父路径是File类型,可以使用File的方法对路径进行一些操作,再使用路径创建对象。
5、File类中的常用方法
5.1 "获取"的方法
public String getAbsolutePath()
:返回此File的 绝对路径名 字符串。
获取的构造方法中传递的路径
无论路径是绝对的还是相对的, getAbsolutePath方法返回的都是绝对路径
public String getPath()
:将此File转换为 路径名 字符串。
获取的构造方法中传递的路径
toString方法调用的就是getPath方法
源码:
public String toString() {
return getPath();
}
public String getName()
:返回由此File表示的文件或目录的名称。
获取的就是构造方法传递路径的【结尾部分】(文件/文件夹)
public long length()
:返回由此File表示的文件的长度。
获取的是构造方法指定的文件的大小, 以字节为单位
注意:
文件夹是没有大小概念的, 不能获取文件夹的大小
如果构造方法中给出的路径不存在, 那么length方法返回 0
5.2 "判断"的方法
public boolean exists()
:此File表示的文件或目录是否实际存在。
存在,返回true;不存在,返回false
File f1 = new File("A:\\IdeaProject\\advance-code\\day08-code-File类");
System.out.println(f1.exist); // 由于路径存在,返回true
File f2 = new File("A:\\IdeaProject\\advance-code\\day08");
System.out.println(f1.exist); // 由于路径不存在,返回false
File f3 = new File("a1.txt");
System.out.println(f3.exist); // 没有a1.txt,返回false
-
public boolean isDirectory()
:此File表示的是否为目录
是,返回true;否,返回false -
public boolean isFile()
:此File表示的是否为文件
是,返回true;否,返回false
注意: 电脑的硬盘中只有【文件】或【文件夹】,上面两个方法是互斥的。这两个方法使用前提——路径必须是存在的, 否则都返回false。
5.3 "创建-删除"的方法
public boolean createNewFile()
:当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
创建文件的路径和名称在构造方法中给出(构造方法的参数)
返回值:布尔值
true: 文件不存在, 创建文件, 返回true
false: 文件存在, 不会创建, 返回false
注意:
1.此方法只能创建文件, 不能创建文件夹
2.创建文件的路径必须存在, 否则会抛出异常
public boolean createNewFile() throws IOException
createNewFile声明抛出了IOException, 我们调用这个方法, 就必须的处理这个异常, 要么throws, 要么try-catch来捕获异常
示例:
private static void show01() throws IOException {
File f1 = new File("A:\\IdeaProject\\advance-code\\day08-code-File类\\ppp.txt");
boolean b1 = f1.createNewFile();
System.out.println("b1:" + b1);
}
public boolean mkdir()
:创建单级空文件夹public boolean mkdirs()
:既可以创建单级空文件夹, 也可以创建多级文件夹
创建文件夹的路径和名称在构造方法中给出(构造方法的参数)
返回值:布尔值
true: 文件夹不存在, 创建文件夹, 返回true
false: 文件夹存在, 不会创建, 返回false; 构造方法中给出的路径不存在返回false
注意:
这两个方法都只能创建文件夹, 不能创建文件
示例:
private static void show02() {
File f1 = new File("A:\\IdeaProject\\advance-code\\day08-code-File类\\aaa");
boolean b1 = f1.mkdir();
System.out.println("b1:" + b1); // 创建aaa文件夹成功,返回true
}
public boolean delete()
:删除由此File表示的文件或目录。
此方法,可以删除构造方法路径中给出的文件/文件夹
返回值:布尔值
true: 文件/文件夹删除成功, 返回true
false: 文件夹中有内容, 不会删除返回false; 构造方法中路径不存在false
注意:
delete方法是直接在硬盘删除文件/文件夹, 不会到回收站中, 所以删除要谨慎
6、File类遍历(文件夹)目录功能
-
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。
遍历构造方法中给出的目录, 会获取目录中所有 文件/文件夹 的名称, 把获取到的多个名称存储到一个String类型的数组中 -
public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。
遍历构造方法中给出的目录, 会获取目录中所有的 文件/文件夹 , 把文件/文件夹封装为File对象, 多个File对象存储到File数组中
注意:
list()方法和listFiles()方法遍历的是构造方法中给出的目录;
如果构造方法中给出的目录的路径不存在, 会抛出空指针异常
如果构造方法中给出的路径不是一个目录, 也会抛出空指针异常
// public String[] list()
File file = new File("A:\\IdeaProject\\advance-code\\day08-code-File类");
String[] arr = file.list();
for (String fileName : arr) {
System.out.println(fileName);
}
// public File[] listFiles()
File file = new File("A:\\IdeaProject\\advance-code\\day08-code-File类");
File[] files = file.listFiles();
for (File f : files) {
System.out.println(f);
}
三、递归
- 直接递归:自己调用自己
- 间接递归:A方法调用B方法,B方法调用C方法,C方法调用A方法之类的
注意事项: 要避免栈内存溢出,构造方法中禁止递归