java8 函数式接口与 Lambda 表达式

2023-10-30

1.函数式接口

举例复习接口的匿名实现

  1. 假设有接口 InterfaceA , 该接口中有抽象方法 T methodA(T t)
  2. 在一般情况下如果想要调用这个方法,需要创建一个类,这个类继承InterfaceA这个接口,并重写抽象方法,根据需求对方法进行具体的实现
  3. 假设现在有两个需求:
    1) 现有List 集合,去除不包含’a’的数据并返回
    2) 现有List 集合,去除不包含小于10的数据并返回
    3) 在不使用接口匿名实现的情况下需要继承这个接口并重写两次抽象方法,进行具体实现,如果还需要去判断List,List ?
  4. 直接创建接口的对象,在大括号中重写抽象方法进行具体的实现
 		//接口的匿名实现类,在Runnable接口中有一个抽象方法run();
        //假设此时需要调用该方法,但是不想创建该接口的实现类,并且可以根据需求进行不同的实现
        //此时就可以使用匿名实现类,创建接口对象,在new 类名(){};
        //大括号中对该接口的方法进行重写
        Runnable r1 = new Runnable(){
            @Override
            public void run(){
                System.out.println("接口匿名实现类,重写抽象方法执行...");
            }
        };
        r1.run();

函数式接口

  1. 什么是函数式接口: 只包含一个抽象方法的接口称为函数式接口,可以通过@FunctionalInterface 来检查创建的接口是否是函数式接口
  2. java8 在 java.util.function包下提供了预定义的函数式接口: 分为消费型, 供给型, 函数型, 断定型:
    在这里插入图片描述
    在这里插入图片描述

2. Lambda表达式

什么是Lambda:

  1. 可以理解为函数式接口的实例化,在通过Lambda不创建类的情况下匿名实现只有一个抽象方法的接口简化写法
  2. 示例:
 		//接口的匿名实现:Comparator中只有一个抽象方法,是java8提供的内置供给型函数式接口
        //new创建对象时,在大括号中重写compare方法,根据需求进行实现
        Comparator<Integer> com1 = new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2){
                return Integer.compare(01, 02);
            }
        };
        //通过接口对象调用重写的抽象方法
         int i1 = com1.compare(2,3);
         System.out.println(i1);

        //通过 Lambda 实现
        //Lambda 写法解释: "->" 为Lambda箭头符
        //"->"左边的括号 为抽象方法形参列表
        //"->"右边的 "{};" 为抽象方法实现的方法体
        Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);

        int i2 = com2.compare(2,3);
        System.out.println(i2);

        //Lambda 方法引用模式
        Comparator<Integer> com3 = Integer :: compare;

        int i3 = com3.compare(2,3);
        System.out.println(i3);

Lambda的几种编写规则解释示例

	@Test
    public void test1(){
        //1.没有形参没有返回值
        //接口匿名实现
        Runnable r1 = new Runnable(){
            //重写的Runnable接口中 run()抽象方法
            @Override
            public void run(){
                System.out.println("接口匿名实现类,重写抽象方法执行...");
            }
        };
        //调用
        r1.run();
        //Lambda编写
        Runnable r2 = () -> {
            System.out.println("Lambda接口匿名实现类,重写抽象方法执行...");
        };


        //2.需要形参,直接将方法的形参放在小括号中
        //接口的匿名实现
        Consumer<String> con = new Consumer<String>(){
            @Override
            public void accept(String s){
                System.out.println(s);
            }
        };
        //Lambda编写
        Consumer<String> con2 =(String s) -> {
            System.out.println(s);
        };


        //3.可以根据数据类型推断出形参类型的,形参类型也可以省略
        //解释: 例如 Consumer 接口中的 accept()抽象方法中需要一个String类型的形参
        //注意,这个形参在定义接口与方法时,由接口到方法,是通过泛型来指定的
        //也就是创建这个接口的对象使用什么泛型类型,那么抽象方法的实现也是什么类型
        //根据接口对象就可以推断出来,叫做类型推断,所以可以省略
        Consumer<String> con3 = new Consumer<String>(){
            @Override
            public void accept(String s){
                System.out.println(s);
            }
        };
        //Lambda编写
        Consumer<String> con4 = (s) -> {
            System.out.println(s);
        };

        //4.由3中只有一个参数,并且参数类型可以推断出来,在编写lambda时,小括号也可以省略
        Consumer<String> con5 =  s -> {
            System.out.println(s);
        };

        //5.当 Lambda 执行体只有一条执行语句时 "->" 的大括号也可以省略
        Consumer<String> con6 =  s -> System.out.println(s);

        //6.当 Lambda 执行体有 return 返回数据时
        //并且只有一条执行语句,想要省略大括号,"return" 关键字也要省略掉
        //接口的匿名实现
        Comparator<Integer> com1 = new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2){
                return Integer.compare(01, 02);
            }
        };
        //Lambda编写
        Comparator<Integer> com2 = (o1, o2) -> Integer.compare(o1, o2);
    }

Lambda 的方法引用与构造器引用

方法引用的解释与编写:

  1. 当要传递给Lambda的方法体是一个已经实现的方法了,就可以使用方法引用,使用 " 类或对象 :: 属于该类或该对象的方法" 引用方法
  2. 方法引用的引用方式:
    对象 :: 实例方法名 (该方法的形参列表与返回值类型必须与抽象方法保持一致)
    类 :: 静态方法名 (该方法的形参列表与返回值类型必须与抽象方法保持一致)
    类 :: 实例方法名 (特殊情况,类是方法体中用来调用另外一个实例方法的数据对象的类型)

方法引用示例:

public class ArrayTest {
    @Test
    public void testName2() {
        //方法引用
        //在ArrayTest类中存在existMethod()非静态方法,与existMethodReturn()静态方法
        //通过创建ArrayTest类对象,根据方法的形参列表,与返回值的类型对应不同的函数式接口,引用这两两个方法,
        ArrayTest objAt = new ArrayTest();

        //1"对象 :: 非静态方法名" 引用示例
        //普通方式
        Consumer<String> con1 = strVal ->System.out.println("普通Lambda:"+strVal);
        //方法引用
        //Consumer 消费型函数式接口,接口中的accept()方法与
        //ArrayTest中existMethod()非静态方法的形参列表,返回值类型一致
        //方法体也符合实际需求,所以创建ArrayTest对象,使用"::"进行引用existMethod方法
        Consumer<String> con2 =  objAt :: existMethod;
        con2.accept("aaa");

        //2"类 :: 静态方法名" 引用示例
        //普通方式
        Supplier<String> supplier1 = () -> ArrayTest.existMethodReturn();
        //Supplier供给类型函数式接口,接口中的get()方法与
        //ArrayTest中existMethodReturn()静态方法的形参列表,
        //返回值类型一致,方法体也符合实际需求.使用ArrayTest类,进行引用
        Supplier<String> supplier2 = ArrayTest :: existMethodReturn;
        String s = supplier2.get();

        //两个参数的方法引用示例:
        //此处Comparator的方法体是通过Integer调用compare()方法,比对t1与 t2两个参数的大小
        Comparator<Integer> com1 = (t1, t2) -> Integer.compare(t1, t2);
        //方法引用
        Comparator<Integer> com2 = Integer :: compare;
        int i = com2.compare(2,3);

        //3"类 :: 实例方法",注意前面的类是谁的类,示例1
        //分析: 此处通过Lambda实现的Comparator中compare抽象方法
        //该方法传递了两个参数 s1,s2,注意方法体是s1去调用String的
        //compareTo方法去使用的
        Comparator<String> com3 = (s1, s2) -> s1.compareTo(s2);

        //在使用"类 :: 实例方法名" 类是方法体中调用方法的对象类型也就是s1的类型
        //注意此时引用的方法与Comparator接口中的compare()方法的形参列表并不一致
        Comparator<String> com4 = String :: compareTo;
        //分析实际执行: 通过前面的"abc"调用compareTo("abc")方法
        com4.compare("abc","abd");

        //"类 :: 实例方法名" 示例2
        BiPredicate<String, String> pre1 = (s1, s2) -> s1.equals(s2);
        //分析方法体,通过s1调用equals()方法得出:调用equals的类型为String类型
        //调用的是equals()方法
        BiPredicate<String, String> pre2 = String :: equals;
        Boolean b = pre2.test("aa","cc");

        //"类 :: 实例方法名" 示例3
        Function<ArrayTest, String> fun1 = arrayTest -> arrayTest.get();
        //分析方法体,传递的一个参数是ArrayTest类型,返回String类型,并且传递
        //的参数在方法体中是用来调用该类参数的实例方法get()来使用的,得到
        Function<ArrayTest, String> fun2 = ArrayTest :: get;
        fun2.apply(objAt);

    }

    public void existMethod(String str){
        System.out.println("已经存在的方法:"+str);
    }
    public static String existMethodReturn(){
        return "已存在静态方法返回参数";
    }
    public  String get(){
        return "已存在实例方法返回参数";
    }
}

构造器引用示例

public class ArrayTest {
    private String name;
    private Integer age;

    public ArrayTest(){
    }
    public ArrayTest(String name){
        this.name = name;
    }
    public ArrayTest(String name, Integer age){
        this.name = name;
        this.age = age;
    }
	@Test
    public void test4(){
        //构造器引用

        //1通过供给类型接口Supplier,该接口的抽象方法<T> get() 返回一个ArrayTest对象
        Supplier<ArrayTest> supplier1 = () -> new ArrayTest();

        //通过new引用该类的构造器
        Supplier<ArrayTest> supplier2 = ArrayTest :: new;
        ArrayTest sArrayTest = supplier2.get();

        //2通过函数类型接口Function中的 R apply(T t) 返回一个ArrayTest对象
        Function<String, ArrayTest> fun1 = str -> new ArrayTest("小明");

        //通过new引用该类的构造器,自动寻找带一个参数的构造
        Function<String, ArrayTest> fun2 = ArrayTest :: new;
        ArrayTest fArrayTest = fun2.apply("小黑");

        //3通过BiFunction中的 R apply(T t, U u) 返回一个ArrayTest对象
        BiFunction<String, Integer, ArrayTest> bif1 = (name, age) -> new ArrayTest("小红", 13);

        //通过new引用该类的构造器
        BiFunction<String, Integer, ArrayTest> bif2 = ArrayTest :: new;
        ArrayTest bArrayTest = bif2.apply("小蓝", 15);

        //4.构造器引用创建数组
        Function<Integer, String[]> funA1 = length -> new String[length];
        Function<Integer, String[]> funA2 = String[] :: new;
        String[] strArr = funA2.apply(10);
        System.out.println(strArr.toString());
    }
}

Lambda 使用示例

public class ArrayTest {
    @Test
    public void test1() {
        //1消费型接口(提供一个参数根据需求实现进行消费没有返回值) Consumer<T>  void accept(T t);
        //解释在该类中有testConsumer(String str, Consumer<String>) 方法,
        //该方法需要String与Consumer<String>两个参数,根据需求重写Consumer中的accept方法进行消费
        //普通方式
        this.testConsumer("aaa", new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println("接口匿名实现消费输出:" + s);
            }
        });

        //Lambda方式
        //如果消费的需求不同,在调用testConsumer()方法时,根据需求定义不同的Lambda方法体
        this.testConsumer("bbb", stringVal -> System.out.println("Lambde消费输出:" + stringVal));


        //2断定型接口(提供一个类型参数,根据需求实现后返回一个Boolean值) Predicate<T>  boolean test(T t);
        //解释在该类中定义了filterString(List<String> list, Predicate<String> p)方法,
        //根据需求不同重写Predicate中的test方法,返回真假,根据返回的真假结果,进行后续操作
        List<String> strList = new ArrayList<>();
        strList.add("ccc");
        strList.add("cac");
        strList.add("bb");
        strList.add("aaa");

        //普通方式(此处重写的test()方法,如果s中包含"a"返回true,执行filterString()中的代码,获取几号中包含"a"的字符串)
        List<String> returnList1 = this.filterString(strList, new Predicate<String>() {
            @Override
            public boolean test(String s) {
                return s.contains("a");
            }
        });
        //Lambda方式(获取集合中包含"c"的字符串)
        List<String> returnlist2 = this.filterString(strList, strVal -> strVal.contains("c"));

        //3供给型接口(不提供参数,根据需求实现后返回一个指定类型参数) Supplier<T>  T get();
        Supplier<String> supplier2 = ArrayTest::existMethodReturn;
        String s = supplier2.get();

        //4函数型接口(提供一个类型参数,根据需求实现后返回另外一个类型的参数) Function<T,R>  R apply(T t);
        Function<Double, Long> fun1 = d -> Math.round(d);
        //方法引用
        Function<Double, Long> fun2 = Math::round;
        fun2.apply(2.5);
    }

    //消费型,根据重写Consumer中accept()方法进行消费
    public void testConsumer(String val1, Consumer<String> con) {
        con.accept(val1);
    }

    //断定型遍历strList中的字符串,如果重写的Predicate接口中的test()方法为真,则将字符串放入新的集合中并返回
    public List<String> filterString(List<String> strList, Predicate<String> pre) {
        List<String> newList = new ArrayList<>();
        for (String s : strList) {
            if (pre.test(s)) {
                newList.add(s);
            }
        }
        return newList;
    }

    public static String existMethodReturn() {
        return "已存在静态方法返回参数";
    }
}

3. 再总结一下Lambda中几个函数

  1. Runnable: 无入参,无返回值
    在这里插入图片描述

  2. Consumer 接受一个参数,没有返回值
    在这里插入图片描述

  3. Function<T, R> 接受一个参数,有返回值
    在这里插入图片描述

  4. Supplier 无入参,有返回值返回泛型类型数据

@FunctionalInterface
public interface Supplier<T> {
    T get();
}
  1. BiConsumer 接受两个参数,没有返回值
    在这里插入图片描述
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java8 函数式接口与 Lambda 表达式 的相关文章

  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • 请求位置更新参数

    这就是 requestLocationUpdates 的样子 我使用它的方式 requestLocationUpdates String provider long minTime float minDistance LocationLis
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 从 android 简单上传到 S3

    我在网上搜索了从 android 上传简单文件到 s3 的方法 但找不到任何有效的方法 我认为这是因为缺乏具体步骤 1 https mobile awsblog com post Tx1V588RKX5XPQB TransferManage
  • 归并排序中的递归:两次递归调用

    private void mergesort int low int high line 1 if low lt high line 2 int middle low high 2 line 3 mergesort low middle l
  • 制作java包

    我的 Java 类组织变得有点混乱 所以我要回顾一下我在 Java 学习中跳过的东西 类路径 我无法安静地将心爱的类编译到我为它们创建的包中 这是我的文件夹层次结构 com david Greet java greeter SayHello
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • JAVA - 如何从扫描仪读取文件中检测到“\n”字符

    第一次海报 我在读取文本文件的扫描仪中读取返回字符时遇到问题 正在读取的文本文件如下所示 test txt start 2 0 30 30 1 1 90 30 0 test txt end 第一行 2 表示两个点 第二行 位置索引 0 xp

随机推荐

  • python笔记:数组的一些操作

    目录 1 对数组求指数和对数 2 数组的最值及其索引 3 按照行或者列求均值 求和 最大值 最小值 标准差 方差 4 取对角线元素 5 取两个数组对应的最大或最小值 6 对数组重新排列 1 对数组求指数和对数 参考 指数 math exp
  • React.lazy懒加载组件

    1 React lazy的用法 React lazy方法可以异步加载组件文件 const Foo React lazy gt import componets ChildComponent React lazy不能单独使用 需要配合Reac
  • mysql关于mysql.server

    1 mysql server服务端工具 主要作用就是为了方便启动和关闭mysql服务 这个脚本中调用mysqld safe来启动mysqld 2 RPM包安装时 发现 etc rc d init d mysql和 usr share mys
  • 使用pip安装package的时候,如何不使用cache的文件,重新下载(防止package之间版本不匹配)

    我们在使用pip安装某一个package的时候 如果安装的有问题向卸载之后重新安装 卸载 pip uninstall mediapipe 重新安装 pip install mediapipe 但是 执行命令之后发现使用了cached的whe
  • CSerialPort教程4.3.x (2) - CSerialPort源码简介

    CSerialPort教程4 3 x 2 CSerialPort源码简介 前言 CSerialPort项目是一个基于C C 的轻量级开源跨平台串口类库 可以轻松实现跨平台多操作系统的串口读写 同时还支持C Java Python Node
  • 位运算符介绍(二):Java位运算符

    Java语言提供了7个位操作运算符 这些运算符只能用于整型操作数 这些整数操作数包括long int short char和byte 这里注意 相对于C C Java多了一个位运算符 gt gt gt 整型操作数也多了一个byte类型 C
  • 【建议收藏】机器学习模型构建(一)——建模调参(内附代码)

    引言 在前一阶段的学习中 我们完成了数据预处理等上游操作 接下来就要开始进行模型的构建 构建模型 sklearn中提供各种机器学习模型的类供我们使用 我们要根据我们的业务逻辑进行相关的筛选进行构建调参 在本例中我将使用sklearn内置的数
  • 机器学习--特征选择(Python代码实现)

    转自 每日一Python 微信公众号 特征选择就是从原始特征中选取一些最有效的特征来降低维度 提高模型泛化能力减低过拟合的过程 主要目的是剔除掉无关特征和冗余特征 选出最优特征子集 常见的特征选择方法可以分为3类 过滤式 filter 包裹
  • 重磅:Kafka 迎来 1.0.0 版本,正式告别四位数版本号!

    Kafka 从首次发布之日起 已经走过了七个年头 从最开始的大规模消息系统 发展成为功能完善的分布式流式处理平台 用于发布和订阅 存储及实时地处理大规模流数据 来自世界各地的数千家公司在使用 Kafka 包括三分之一的 500 强公司 Ka
  • OpenCV中基于LBP算法的人脸检测测试代码

    下面是OpenCV 3 3中基于CascadeClassifier类的LBP算法实现的人脸检测 从结果上看 不如其它开源库效果好 如libfacedetection 可参考 https blog csdn net fengbingchun
  • 自动控制原理-频率特性 G(jw ) 定义

    目录 预先的知识点 正题 定义一 物理定义 定义二 定义三 理解即可 不要求掌握 运用 预先的知识点 1 复数 一般定义
  • 超高频RFID读写器构建医疗化验全程RFID跟踪管理系统

    1 背景 Ambient ID发布了超高频UHF Gen 2 RFID系统的解决方案 使用Trimble旗下Thingmagic超高频RFID读写器 用来跟踪那些从医院到化验室里进行诊断测试的标本瓶 标本瓶里盛有人体组织或血液 这个方案可以
  • dnsmasq安装

    一 dnsmasq下载 下载地址 Index of dnsmasq 二 dnsmasq配置 决定dnsmasq支持什么功能是通过修改src config h 需要的XX功能通过 define XX make时 XX功能编译到dnsmasq命
  • JavaScript中的iterable

    遍历Array可以采用下标循环 遍历Map和Set就无法使用下标 为了统一集合类型 ES6标准引入了新的iterable类型 Array Map和Set都属于iterable类型 具有iterable类型的集合可以通过新的for of循环来
  • Laravel初探——安装

    安装Composer 1 curl sS https getcomposer org installer php 2 mv composer phar usr local bin composer 3 composer install 安装
  • Java之美[从菜鸟到高手演变]之设计模式二

    在阅读过程中有任何问题 请及时联系 egg 邮箱 xtfggef gmail com 微博 http weibo com xtfggef 如有转载 请说明出处 http blog csdn net zhangerqing 我们接着讨论设计模
  • 变量的声明和定义

    1 声明和定义的区别 变量声明规定了变量的类型和名字 而定义是在声明的基础上还开辟了存储空间 可能还会为变量初始化一个初始值 2 c 为什么要将声明和定义分开 c 支持分离式编译机制 允许将程序分割为若干个文件 每个文件可被独立编译 而为了
  • 华为云云耀云服务器L实例评测

    目录 引出 起因 si因 解决报错 诶嘿 连上了 不出意外 就出意外了 打开数据库 what 找华为云求助 教训 备份 教训 密码 解决 1 改密码 2 新建一个MySQL 密码设置复杂一点 3 开启 binlog备份 MySQL的binl
  • Java二维数组静态以及动态初始化方法

    import java util Random public class test2 public static void main String args 二维数组静态初始化 int arr 1 2 3 4 5 6 7 8 9 Syste
  • java8 函数式接口与 Lambda 表达式

    函数式接口与 Lambda 表达式 1 函数式接口 举例复习接口的匿名实现 函数式接口 2 Lambda表达式 什么是Lambda Lambda的几种编写规则解释示例 Lambda 的方法引用与构造器引用 方法引用的解释与编写 方法引用示例