1.Lamdba表达式

1.Lambda表达式的标准格式

三部分组成:

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

格式:

(参数列表) -> {一些重写方法的代码}

解释说明格式:

  • ():接口中抽象方法的参数列表,没有参数,就空着;有参数就写出参数,多个参数使用逗号分隔
  • ->:传递的意思,把参数传递给方法体{}
  • {}:重写接口的抽象方法的方法体
public class DemoLambda{
public static void main(String[] args){
//使用匿名内部类的方式,实现多线程
new Thread(new Runnable(){
@Override
public void run(){
System.out.println(Thread.currentThread().getName()+"新线程创建了");
}
}).start();
//使用lambda表达式
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"新线程创建了");
}).start();
//优化Lambda
//优化省略Lambda
new Thread(()->System.out.println(Thread.currentThread().getName()+" 新线程创建了")).start();
}
}
1.案例
  1. 需求: 给定一个厨子Cook接口,内含唯一的抽象方法makeFood,且无参数、无返回值。 使用Lambda的标准格式调用invokeCook方法,打印输出“吃饭啦!”字样

    //定义Cook接口
    public interface Cook{
    public abstract void makeFood();
    }
    //使用Lambda
    public class Demo{
    public static void main(String[] args){
    //调用invokeCook方法,参数是Cook接口,传递Cook对象
    invokeCook(new Cook(){
    @Override
    public void makeFood(){
    System.out.println("吃饭了");
    }
    });
    //使用Lambda函数
    invokeCook(()->{
    System.out.println("吃饭了");
    });
    // 优化
    invokeCook(()-> System.out.println("吃饭了"));
    }
    //定义一个方法,参数传递Cook接口,方法内部调用makeFood()方法
    public static void invokeCook(Cook cook){
    cook.makeFood();
    }
    }
  2. 需求:

    给定一个计算器Calculator接口,内含抽象方法calc可以将两个int数字相加得到和值 使用Lambda的标准格式调用invokeCalc方法,完成120和130的相加计算

    // 接口
    public interface Calculator{
    public abstract calc(int a, int b);
    }
    public class Demo{
    public static void main(String[] args){
    // 调用invokeCalc方法,方法的参数是一个接口,使用匿名内部类
    invokeCalc(10,20, new Calculator(){
    @Override
    public int calc(int a, int b){
    return a+b;
    }
    });
    //使用Lambda表达式简化匿名内部类的书写
    invokeCalc(120, 130,(int a, int b)->{
    return a+b;
    });
    //优化
    invokeCalc(120,130,(a,b)-> a+b);
    }
    /*
    定义一个方法
    参数传递两个int类型的整数
    参数传递Calculator接口
    方法内部调用Calculator中的方法calc计算两个整数的和
    */
    public static void invokeCalc(int a,int b,Calculator c){
    int sum = c.calc(a,b);
    System.out.println(sum);
    }
    }

2.Lambda省略规则

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

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

Lambda表达式:是可推导,可以省略 凡是根据上下文推导出来的内容,都可以省略书写 可以省略的内容:

  1. (参数列表):括号中参数列表的数据类型,可以省略不写

  2. (参数列表):括号中的参数如果只有一个,那么类型和()都可以省略

  3. {一些代码}:如果{}中的代码只有一行,无论是否有返回值,都可以省略({},return,分号)注意:要省略{},return,分号必须一起省略

    import java.util.ArrayList;
    public class Demo01ArrayList {
    public static void main(String[] args) {
    //JDK1.7版本之前,创建集合对象必须把前后的泛型都写上
    ArrayList<String> list01 = new ArrayList<String>(); //JDK1.7版本之后,=号后边的泛型可以省略,后边的泛型可以根据前边的泛型推导出来
    ArrayList<String> list02 = new ArrayList<>();
    }
    }

3.使用前提

Lambda的语法非常简洁,特别注意:

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

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

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

2.File类

1.概述

java.io.File是文件和目录的类,用于文件和目录的创建,查找和删除操作

2.构造方法

  • public File(String pathName):通过指定的路径名称字符串转换为抽象路径名来创建新的File实例

  • public File(String parent, String child):从父路径名字符串和子路径字符串创建File实例

  • public File(File parent, String child):从父抽象路径名和子路径名字符串创建新的File实例

  • 构造实例

    //文件路径名
    String pathName = "D:\\aaa.txt";
    File file = new File(pathName); //文件路径名
    String pathName = "D:\\a";
    String child = "b.txt";
    File file = new File(pathName, child); //第三种
    File parentDir = new File("d:\\aaaa");
    String child = "b.txt";
    File file = new File(parentDir, child);
    /*
    1. 一个File对象代表硬盘中实际存在的一个文件或者目录。
    2. 无论该路径下是否存在文件或者目录,都不影响File对象的创建。*/

3.常用方法

获取功能的方法
  • public String getAbsolutePath(): 返回此File的绝对路径字符串名字

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

  • public String getName():返回此File表示的文件或目录的名称

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

  • 代码如下

    public class FileDemo{
    public static void main(String[] args){
    File f = new File("d:/aaa/bbb.java");
    System.out.println("文件绝对路径:"+f.getAbsolutePath());
    System.out.println("文件构造路径:"+f.getPath());
    System.out.println("文件名称:"+f.getName());
    System.out.println("文件长度:"+f.length()+"字节");
    File f2 = new File("d:/aaa");
    System.out.println("目录绝对路径:"+f2.getAbsolutePath());
    System.out.println("目录构造路径:"+f2.getPath());
    System.out.println("目录名称:"+f2.getName());
    System.out.println("目录长度:"+f2.length());
    }
    }
    // :length(),表示文件的长度。但是File对象表示目录,则返回值未指定。
绝对路径和相对路径
  • 绝对路径: 从根目录开始
  • 相对路径: 当前目录
public class FilePath {
public static void main(String[] args) {
// D盘下的bbb.java文件
File f = new File("D:\\bbb.java");
System.out.println(f.getAbsolutePath());
// 项目下的bbb.java文件
File f2 = new File("bbb.java");
System.out.println(f2.getAbsolutePath());
}
}
判断功能的方法
  • public boolean exists():此File表示的文件或目录是否实际存在

  • public boolean isDirectory(): 是否是目录

  • public boolean isFile():是否为文件

  • 代码

    public class FileIs {
    public static void main(String[] args) {
    File f = new File("d:\\aaa\\bbb.java");
    File f2 = new File("d:\\aaa");
    // 判断是否存在
    System.out.println("d:\\aaa\\bbb.java 是否存在:"+f.exists());
    System.out.println("d:\\aaa 是否存在:"+f2.exists());
    // 判断是文件还是目录
    System.out.println("d:\\aaa 文件?:"+f2.isFile());
    System.out.println("d:\\aaa 目录?:"+f2.isDirectory());
    }
    }
创建删除功能的方法
  • public boolean createNewFile():当且仅当具有该名称文件不存在的时候,创建一个新的空文件

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

  • public boolean mkdir():创建此文件的目录

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

  • 代码

    public class FileCreateDelete {
    public static void main(String[] args) throws IOException {
    // 文件的创建
    File f = new File("aaa.txt");
    System.out.println("是否存在:"+f.exists()); // false
    System.out.println("是否创建:"+f.createNewFile()); // true
    System.out.println("是否存在:"+f.exists()); // true
    // 目录的创建
    File f2= new File("newDir");
    System.out.println("是否存在:"+f2.exists());// false
    System.out.println("是否创建:"+f2.mkdir()); // true
    System.out.println("是否存在:"+f2.exists());// true
    // 创建多级目录
    File f3= new File("newDira\\newDirb");
    System.out.println(f3.mkdir());// false
    File f4= new File("newDira\\newDirb");
    System.out.println(f4.mkdirs());// true
    // 文件的删除
    System.out.println(f.delete());// true
    // 目录的删除
    System.out.println(f2.delete());// true
    System.out.println(f4.delete());// false
    }
    }
    // delete方法,如果此File表示目录,则目录必须为空才能删除

4.目录的遍历

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

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

    public class FileFor {
    public static void main(String[] args) {
    File dir = new File("d:\\java_code");
    //获取当前目录下的文件以及文件夹的名称。
    String[] names = dir.list();
    for(String name : names){
    System.out.println(name);
    }
    //获取当前目录下的文件以及文件夹对象,只要拿到了文件对象,那么就可以获取更多信息
    File[] files = dir.listFiles();
    for (File file : files) {
    System.out.println(file);
    }
    }
    }
    //调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历

3.递归

1.什么是递归

  • 递归: 当前方法调用自己的这种现象
  • 递归的分类:
    • 递归分为两种,直接递归和间接递归。
    • 直接递归称为方法自身调用自己。
    • 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法
  • 注意事项:
    • 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
    • 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
    • 构造方法,禁止递归
public class DemoDiGgui{
public static void main(String[] args){
b(1);
}
//3.构造方法,静止递归
// 编译报错: 构造方法是创建对象的,不能让对象一直创建下去
public DemoDiGui(){ }
// 2.递归的限定条件,发生栈内存溢出
private static void b(int i){
System.out.println(i);
//递归结束的条件
if(i==500){
return;//结束方法
}
b(++i);
}
//1.递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。 Exception in thread "main"
//java.lang.StackOverflowError private static void a() {
System.out.println("a方法");
a();
}
}

2.累加求和

public class DiguiSum{
public static void main(String[] args){
// 计算1-num的和
//调用求和的方法
int sum = getSum(num);
//输出结果
System.out.println(sum);
}
public static int getSum(int num){
if(num==1){
return 1;
}
return num+getSum(num-1);
}
}

Lambda,递归的更多相关文章

  1. c++11 lambda递归调用写法

    偶然想到要在函数内部使用lambda递归调用,以下是可行的写法,可参考 std::function<void(Node * container,const BlendFunc &blen ...

  2. Haskell 笔记 ③

    ①循环?NO!请递归思考问题! 手艹一个求列表中最大值代码,C语言中习惯性for扫一下比较出最大值.但是可以用递归! maximum'::(Ord a)=>[a]->a maximum' ...

  3. 前端进阶笔记(一)---JS语言通识

    一.语言按照语法分类 1.非形式语言:中文 英文 2.形式语言:乔姆斯基谱系(四种文法 上下文包含文法) 0型 无限制文法 1型 上下文相关文法 2型 上下文无关文法 正则文法 二 产生式(BNF) ...

  4. 分享一个递归无限级拼接Json的方法---ExtJs的TreePanel和TreeGrid均适用(Ef,Lambda,Linq,IQueryable,List)

    话不多说,先上实体类,如果你不是codefirst,就把它当成数据表结构. 下面是底层BaseDal获取数据的方法  (如果你没有Base类,直接写在你的DAL层和BLL层) 下面是BaseServi ...

  5. python函数,lambda表达式,三目运算,列表解析,递归

    一.自定义函数 定义函数时,函数体不执行:只有在调用函数时,函数体才执行.函数的结构: 1. def 2. 函数名 3. 函数体 def func_name(): 函数体 4. 返回值 如果没有声明返 ...

  6. python学习笔记12(函数三): 参数类型、递归、lambda函数

    一.函数参数的类型 之前我们接触到的那种函数参数定义和传递方式叫做位置参数,即参数是通过位置进行匹配的,从左到右,依次进行匹配,这个对参数的位置和个数都有严格的要求.而在Python中还有一种是通过参 ...

  7. Python自动化运维之3、函数、lambda、递归

    一.函数 函数的基础概念: 函数是python为了代码最大程度地重用和最小化代码冗余而提供的基本结构 函数是一种设计工具,它能让程序员将复杂的系统分解为可管理的部件 函数用于将相关功能打包并参数化 在 ...

  8. Python爬虫与数据分析之进阶教程:文件操作、lambda表达式、递归、yield生成器

    专栏目录: Python爬虫与数据分析之python教学视频.python源码分享,python Python爬虫与数据分析之基础教程:Python的语法.字典.元组.列表 Python爬虫与数据分析 ...

  9. 简单易懂的程序语言入门小册子(1.5):基于文本替换的解释器,递归定义与lambda演算的一些额外说明

    这一篇接在第一篇lambda演算的后面.讲讲一些数学知识. 经常有些看似很容易理解的东西,一旦要描述得准确无误,就会变得极为麻烦. 软件工程里也有类似情况:20%的代码实现了核心功能,剩下80%的代码 ...

  10. Day14--Python--函数二,lambda,sorted,filter,map,递归,二分法

    今日主要内容:1. lambda 匿名函数 lambda 参数: 返回值-------------------------------------def square(x): return x**2 ...

随机推荐

  1. 使用gitolite搭建Git服务器

    使用gitolite搭建Git服务器 运行环境 Ubuntu18.04 gitolite 搭建过程 安装好Ubuntu18.04系统 更新系统 sudo apt update sudo apt upg ...

  2. apache commons lang架包介绍

    commons lang组件介绍和学习 介绍 Java语言开发时有一个隐患,那就是java支持null值,这就导致很多时候操作可能会出异常. 因此很多第三方组件都会提供安全null safe 操作(即 ...

  3. 表单生成器(Form Builder)之mongodb表单数据——整理数据

    在上篇笔记中,为车辆信息表.车辆耗损表以及车辆营收表插入了一些数据.之后便是查询了,重点也在查询……按照之前定好的数据结构,如果查询mongodb document的最外层比较简单,但是我们的重点应该 ...

  4. linux 启动jar包 指定yml配置文件和输入日志文件

    命令为: nohup java -jar project.jar  --spring.config.location=/home/project-conf/application.yml >  ...

  5. Goland安装

    Goland安装 http://c.biancheng.net/view/6124.html

  6. 多项式总结(STAGE 1)

    这么难的专题居然只给了这么短时间... 然而在NC的教导之下还是有一定的收获的. 必须打广告:0,1,2,3 附带一个垃圾博客:-1 按照习惯,堆砌结论而不加证明. Section1 导数: 基本形式 ...

  7. RN调试坑点总结(不定期更新)

    前言 我感觉,如果模拟器是个人的话,我已经想打死他了 大家不要催我学flutter啦,哈哈哈,学了后跟大家分享下 RN报错的终极解决办法 众所周知,RN经常遇到无可奈何的超级Bug, 那么对于这些问题 ...

  8. APP自动化针对PO模式进行二次封装之basepage

    APP自动化跟WEB自动化所使用的框架基本一样,都是采用的PO模式结合pytest框架编写自动化测试脚本,为了提高代码的复用性.稳定性和易维护性,我们针对PO模式进行了二次封装,将日志,等待以及异常截 ...

  9. 体感在js中的调用

    体感技术,在于人们可以很直接地使用肢体动作,与周边的装置或环境互动,而无需使用任何复杂的控制设备,便可让人们身临其境地与内容做互动. 体感分为三大类: 惯性感测:主要是以惯性传感器为主,例如用重力传感 ...

  10. mysql中的事务隔离级别

    事务是逻辑上的一组操作,要么都执行,要么都不执行. 事务最经典的.经常被拿出来说的例子就是转账了.假如小花要给小白转账1000元,这个转账会涉及到两个关键操作就是:将小花的余额-1000,将小白的余额 ...