day26_Lambda&File

  • 函数式编程思想
  • 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);

省略规则:

  1. ​ 小括号内的参数类型可以省略
  2. ​ 如果小括号内有且仅有一个参数,则小括号也可以省略
  3. ​ 如果大括号内有且仅有一个语句,则无论是否有返回值,都可以省略大括号、return关键字和语句的分号,这些东西要一起省略

Lambda的使用前提

lambda的语法非常简洁,使用非常的简单,但有以下注意事项:

  1. ​ 使用Lambda必须具有接口,且要求接口中有且仅有一个抽象方法,无论JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一(可以有其他的静态方法、默认方法),才可以使用Lambda
  2. ​ 使用Lambda必须具有上下文推断。也就是方法的参数或者局部变量类型必须为lambda对应的接口类型,才能使用Lambda作为该接口的实例

备注:如果有且仅有一个抽象方法的接口,称为函数式接口

File类

  • 说出File类获取文件名称的方法
  • 了解File对象的创建方式、获取绝对路径的方法名称
  • 区分文件操作中的相对路径与绝对路径
  • File类获取文件大小的方法
  • 判断一个文件是否为文件
  • 遍历文件夹(目录)
  • 判断文件是文件夹还是文件
  • 解释递归的含义
  • 使用递归的方式做相关数学运算
  • 解释使用递归引发内存溢出隐患的原因

java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找、删除等操作。

Java把电脑中的文件和文件夹(目录)封装为了一个File类,我们可以使用File类对文件和文件夹进行操作

可以使用的File类方法:

  • ​ 创建一个文件 / 文件夹
  • ​ 删除一个文件 / 文件夹
  • ​ 获取一个文件 / 文件夹
  • ​ 判断一个文件 / 文件夹是否存在
  • ​ 对文件夹进行遍历
  • ​ 获取文件的大小

File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法。

构造方法

  1. ​ public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例

  2. ​ public File(File parent, String child):根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例

  3. ​ 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方法:

  • ​ 获取功能方法
  • ​ 判断功能的方法
  • ​ 获取路径功能的方法
  • ​ 创建删除更能的方法
  • ​ 目录遍历功能的方法
获取功能的方法:
  1. ​ public String getAbsolutePath():返回此抽象路径名的绝对路径名字符串
  2. ​ public String getPath():将此File转换为路径名字符串
  3. ​ public String getName():返回由此File表示的文件或目录的名称
  4. ​ public long length():返回此File表示的文件的长度
判断功能的方法:
  1. ​ public boolean exist():判断File表示的文件或者文件夹是否实际存在
  2. ​ public boolean isDirectory():判断此File表示的文件夹是否存在
  3. ​ public boolean isFile():判断此File表示的文件是否存在
创建和删除文件的方法
  1. ​ public boolean createNewFlie():当且仅当具有该文件名称的文件不存在时,创建一个新的空文件
  2. ​ public boolean delete():删除由此File表示的文件或者目录
  3. ​ public boolean mkdir():创建由此File表示的文件夹
  4. ​ public boolean mkdirs():创建由此File表示的文件夹,包括任何必须但是又不存在的父目录
目录的遍历

public String [ ] list():返回一个String数组,表示该File目录中的所有的子目录或者子文件

public File [ ] listFile():返回一个File数组,表示该File目录中的所有的子目录或者子文件

Java标准库还提供了一个Path对象,它位于java.nio.file包。Path对象和File对象类似,但操作更加简单

原文地址:https://www.cnblogs.com/mitoris/p/14131567.html