Javase-day18-Lambda表达式、File类、递归

一、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方法之类的

注意事项: 要避免栈内存溢出,构造方法中禁止递归

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值