- 函数式编程思想
- Lambda表达式
- File类
- 递归
函数式编程思想
强调的是做什么,而不是以什么样的方式来做,它忽略了面向对象的复杂语法,只要能够获取到结果,不关心谁去做,如何做。重要的是将结果,不重视过程
一段冗余的Runnable代码
public static void main(String[] args) {
//简化版(匿名内部类写法)
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"新线程被创建......");
}
}).start();
}
代码分析:
对于Runnable的匿名内部类用法:
- Thread类需要Runnable接口作为参数,其中的抽象方法run用来指定线程任务内容的核心
- 为了指定run方法的方法体,不得不需要Runnable接口的实现类
- 为了省去定义一个RunnableImpl实现类的麻烦,不得不使用匿名内部类
- 必须重写抽线方法run,所以方法的名称、方法的参数、方法的返回值不得不再写一遍,且不能写错
- 从这里看出,只有方法体内容的重写才是线程任务的关键内容
编程思想的转换
强调做什么而不是怎么做
开启新线程时,我们真正希望做的事情是将run方法体内的代码传递给Thread类知晓,能够加载到即可。
任务就是传递一段代码----我们需要将程序开发关注的重点从怎么做回归到做什么的本质上,过程与形式并不重要
2014年3月Oracle官方发布的JAVA 8(JDK1.8)中,加入了Lambda表达式
//使用lambda表达式实现
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"新线程被创建......");
}).start();
从上面的代码可以看出:没有创建接口实现类对象,也不再有抽象方法覆盖重写负担了,只写了线程任务的内容
()->{System.out.println(Thread.currentThread().getName()+"新线程被创建......");}
格式说明:
* ():接口中抽象方法的参数列表,参数列表可以没有参数,空着,有参数就写出来,多个参数使 * 用','隔开
* ->:传递的意思,把方法中的参数传递给方法体{}
* {}:重写接口方法的方法体
Lambda表达式的标准格式:
(参数列表) -> {代码语句}
Lambda省略格式
可推导即可省略
invokeSum(3.14,3.15,(double d1,double d2)->{
return d1 + d2;
});
//省略式表达
invokeSum(3.14,3.15(d1,d2)-> d1 + d2);
省略规则:
- 小括号内的参数类型可以省略
- 如果小括号内有且仅有一个参数,则小括号也可以省略
- 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字和语句的分号,这些东西要一起省略
Lambda的使用前提
lambda的语法非常简洁,使用非常的简单,但有以下注意事项:
- 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法,无论JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一(可以有其他的静态方法、默认方法),才可以使用Lambda
- 使用Lambda必须具有上下文推断。也就是方法的参数或者局部变量类型必须为lambda对应的接口类型,才能使用Lambda作为该接口的实例
备注:如果有且仅有一个抽象方法的接口,称为函数式接口
File类
- 说出File类获取文件名称的方法
- 了解File对象的创建方式、获取绝对路径的方法名称
- 区分文件操作中的相对路径与绝对路径
- File类获取文件大小的方法
- 判断一个文件是否为文件
- 遍历文件夹(目录)
- 判断文件是文件夹还是文件
- 解释递归的含义
- 使用递归的方式做相关数学运算
- 解释使用递归引发内存溢出隐患的原因
java.io.File
类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找、删除等操作。
Java把电脑中的文件和文件夹(目录)封装为了一个File类,我们可以使用File类对文件和文件夹进行操作
可以使用的File类方法:
- 创建一个文件 / 文件夹
- 删除一个文件 / 文件夹
- 获取一个文件 / 文件夹
- 判断一个文件 / 文件夹是否存在
- 对文件夹进行遍历
- 获取文件的大小
File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法。
构造方法
-
public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新
File
实例 -
public File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新
File
实例 -
public File(String parent, String child):根据 parent 路径名字符串和 child 路径名字符串创建一个新
File
实例// 假设当前目录是C:Docs File f1 = new File("sub\javac"); // 绝对路径是C:Docssubjavac File f3 = new File(".\sub\javac"); // 绝对路径是C:Docssubjavac File f3 = new File("..\sub\javac"); // 绝对路径是C:subjavac 可以用'.'表示当前目录,'..'表示上级目录。 构造File对象时,既可以传入绝对路径,也可以传入相对路径。绝对路径是以根目录开头的完整路径 传入相对路径时,相对路径前面加上当前目录就是绝对路径
常用的API方法:
- 获取功能方法
- 判断功能的方法
- 获取路径功能的方法
- 创建删除更能的方法
- 目录遍历功能的方法
获取功能的方法:
- public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
- public String getPath():将此File转换为路径名字符串
- public String getName():返回由此File表示的文件或目录的名称
- public long length():返回此File表示的文件的长度
判断功能的方法:
- public boolean exist():判断File表示的文件或者文件夹是否实际存在
- public boolean isDirectory():判断此File表示的文件夹是否存在
- public boolean isFile():判断此File表示的文件是否存在
创建和删除文件的方法
- public boolean createNewFlie():当且仅当具有该文件名称的文件不存在时,创建一个新的空文件
- public boolean delete():删除由此File表示的文件或者目录
- public boolean mkdir():创建由此File表示的文件夹
- public boolean mkdirs():创建由此File表示的文件夹,包括任何必须但是又不存在的父目录
目录的遍历
public String [ ] list():返回一个String数组,表示该File目录中的所有的子目录或者子文件
public File [ ] listFile():返回一个File数组,表示该File目录中的所有的子目录或者子文件
Java标准库还提供了一个Path
对象,它位于java.nio.file
包。Path
对象和File
对象类似,但操作更加简单