• Java基础(二十二) Lambda表达式和File类


    函数式编程思想

       强调的是做什么,而不是以什么样的方式来做,它忽略了面向对象的复杂语法,只要能够获取到结果,谁去做的,怎么做的,都不重要,重要的是结果,不重视过程。

    冗余的Runnable代码

      传统的写法:

     1 public class Demo01Runnable{
     2     public static void main(String[] args){
     3             //匿名内部类的方式
     4             new Thread(new Runnable(){
     5                 @Overrride 
     6                 public void run(){
     7                     System.out.println("开启了一个新的线程");
     8                 }
     9             } ).start();//启动新线程
    10     }
    11 }

    代码分析:

      对于Runnable的匿名内部类用法,可以分析出以下内容:

    • Thread类需要Runnable接口作为参数,其中抽象方法run用来指定线程任务内容的核心。
    • 为了制定run方法的方法体,不得不需要Runnable接口的实现类
    • 为了省去定义一个RunnableImpl实现类的麻烦,不得不使用匿名内部类。
    • 必须重写抽象方法run方法,所以方法的名称、方法的参数、方法的返回值不得不再写一遍,且不能写错。
    • 从这里可以看出,只有方法体才是线程任务的关键性内容

    编程思想的转换

      强调做什么而不是怎么做

      我们真正希望做的事情是:将run方法体内的代码传递给Thread类知晓,能够加载到即可。

      传递一段代码———这是我们真正的目的。

      我们需要将程序关注的重点从怎么做回归到做什么的本质上,过程与形式并不重要。

       2014年3月Oracle官方所发布的Java8(JDK1.8)中,加入了Lambda表达式

    体验Lambda表达式的更优写法 

      Java 8的新特性,优化刚才的代码

    public class Demo01Runnable{
        public static void main(String[] args){
                //使用Lambda表达式的方式
                new Thread(()->{
                        System.out.println("开启了一个新的线程");
                    }
                ).start();//启动新线程        
        }
    }

      从上面的代码可以看出:没有创建接口实现类对象的操作,不再有抽象方法覆盖重写的操作,只写了线程任务的内容。

      从上面的代码能够推导出Lambda的语法: 

    () -> {System.out.println("开启了一个新的线程");}
    • 前面的一对小括号即run方法,参数为无,里面是空的,此时不需要任何的条件
    • 中间的一个箭头代表将前面的参数传递给后面的代码
    • 后面的输出语句即业务逻辑代码(线程任务内容)

    Lambda的标准格式:

      格式由三个部分组成:

    • 一些参数
    • 一个箭头
    • 一段代码

     Lambda表达式的标准格式:

    (参数类型1 参数名称1,参数类型2 参数名称2,...) -> {代码语句}

     格式说明:

    • 小括号内的语法与传统方法参数列表一致,无参数则留空,多个参数则用逗号隔开
    • ->是新引入的语法格式,代表指向的动作
    • 大括号内的语法与传统方法体要求基本一致。

    Lambda省略格式

      可推导即可省略

      Lambda强调的是"做什么",而不是"怎么做",所以凡是可以根据上下文推倒得知的信息,都可以省略。比如:

    1 invokeSum(3.14, 3.15, (double d1,double d2)->{
    2             return d1 + d2;
    3         });
    4 
    5 //省略格式表达
    6 invokeSum(3.14,3.15,(d1,d2)->d1 + d2);

       省略的规则:

       在Lambda标准格式的表达式的基础上,使用省略写法的规则是:

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

    Lambda的使用前提

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

        1.使用Lambda表达式必须具有接口,且要求接口中有且仅有一个抽象方法,无论JDK内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一,才可以使用Lambda

        2.使用Lambda必须具有上下文推断。也就是方法的参数或者是局部变量类型必须为Lambda对应的接口类型,才能使用Lambda作为该接口的实例。

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

    File类

    概述

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

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

      可以使用File类的方法:

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

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

      路径 :

      绝对路径:是一个完整的路径,一般以盘符(D:,C:,c:)为开头如:

    D:DeveloperJavajdk1.8.0_191 

      相对路径:是一个简化的路径,相对指的是相对于当前项目的根目录如:(E:codeworkspaceday26_Lambda)

      如果使用当前项目的根目录,路径可以简化书写,E:codeworkspaceday26_Lambda.classpath ----> 简化为:.classpath(可以省略前面项目的根目录)

      注意:

      1.路径是不区分大小写;

      2.路径中的文件名称分隔符windows使用反斜杠(),反斜杠是转义字符,两个反斜杠才代表一个普通的反斜杠;

    构造方法

    • public File(String pathname):通过将给定路径名字符串转换为抽象路径名来创建一个新File实例
    • public File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
    • public File(File parent ,String child)根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

    常用API方法

    • 获取功能的方法

    • 判断功能的方法

    • 路径功能的方法

    • 创建删除的方法

    • 目录遍历功能的方法

    获取功能的方法

    • public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。

    • public String getPath(): 将此File转换为路径名字符串

    • public String getName() 返回由此抽象路径名表示的文件或目录的名称。

    • public long length():返回此File表示的文件的长度。

    判断功能的方法

    • public boolean exists():判断File表示的文件或者文件夹是否实际存在

    • public boolean isDirectory() 判断此File表示的文件夹是否存在。

    • public boolean isFile():判断此File表示的文件是否存在

    创建和删除文件的方法

    • public boolean cteateNewFile():当且仅当具有该名称的文件不存在时,创建一个新的空的文件,返回值是true

    • public boolean delete():删除由此File表示的文件或者目录

    • public boolean mkdir():创建由此File表示的文件夹

    • public boolean mkdirs():创建由此File表示的文件夹,包括任何必须但是又不存在的父目录

    目录的遍历

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

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

  • 相关阅读:
    Java反射得到属性的值和设置属性的值
    想建一个比较严格的自律打卡监督群,群主真的会很较真
    JS面向对象篇四、原型链与继承(多种继承实现方式及其利弊分析)
    JS面向对象篇三、创建对象的几种方法
    JS面向对象篇二、什么是原型?原型对象与实例对象、构造函数的关系及相关方法
    JS面向对象篇一、理解对象及属性特性(属性描述符)
    javascript作用域篇一、什么是javascript作用域链
    javascript函数篇四、函数的属性和方法——apply()、call()和bind()方法区别
    javascript函数篇三、函数声明提升
    javascript函数篇二、深入理解为什么javascript中没有函数重载
  • 原文地址:https://www.cnblogs.com/lk625/p/14126339.html
Copyright © 2020-2023  润新知