【再学一次系列】Lambda必知必会

547 阅读3分钟

「这是我参与2022首次更文挑战的第1天,活动详情查看:2022首次更文挑战

前言

哈喽大家好,我是卡诺,一名致力于成为全栈的全粘工程师!

今天要和大家一起学习Lambda表达式,Lambda表达式是Java8开始出现的新特性,相信现在应该有很多小伙伴用着Java8+版本,写的却是Java7的代码(没错,就是我了)!接下来我们就一起开启Lambda的学习吧!

你要懂的几个概念

  • 什么是接口默认方法?

    • 使用default关键字在接口中添加方法实现,如下代码:
public interface IDefaultMethod {
    default void printDefault() {
        System.out.println("Hello default method");
    }
}
// test
void testDefaultMethod() {
   IDefaultMethod iDefaultMethod = new IDefaultMethod() {};
   iDefaultMethod.printDefault();
}
  • 什么是函数式接口?

    • 有且仅有一个抽象方法声明的接口(但接口可以有多个默认方法),当然为了让编译器能够识别,更建议你在接口上增加 @FunctionalInterface用以标记(非必须使用,但是强烈建议标注),此时添加编译器则会给出报错提示,函数式接口如下:
@FunctionalInterface
public interface IFunctionalMethod {
    void helloWord();

    default void printDefault() {
        System.out.println("Hello default method");
    }

    default void printDefaultJava() {
        System.out.println("Hello default java");
    }
}
// test
public void test(){
    IFunctionalMethod iFunctionalMethod = new IFunctionalMethod() {
        @Override
        public void helloWord() {
            System.out.println("impl hello word");
        }
    };
    iFunctionalMethod.helloWord();
    iFunctionalMethod.printDefault();
    iFunctionalMethod.printDefaultJava();
}
  • 什么是Lambda表达式?
    • 是一个匿名函数,可以当作参数传递;
    • 需要注意的是,lambda并不是任何地方都可以使用,需要特定的函数式接口进行匹配。
    • 如果你正在使用idea进行开发,你会发现在IFunctionalMethod的测试代码部分我们声明的函数,idea会建议我们Replace with lambda, 如下图:

  • 调整后的lambda代码如下:
public void testLambda(){
    IFunctionalMethod iFunctionalMethod = () -> System.out.println("impl hello word");
    iFunctionalMethod.helloWord();
    iFunctionalMethod.printDefault();
    iFunctionalMethod.printDefaultJava();
}

通过上面几个基础概念和简单的例子演示,我们可以看出Lambda让代码更加简洁、紧凑(如果你们公司是按照代码行数算绩效,建议不要使用Lambda,因为它实在是太简洁了),接下来我们趁着打铁,赶快看看Lambda更多的骚操作!

Lambda表达式语法结构

任何一种语法都有它的使用规则,Lambda当然也不例外,我们来看看Lambda的语法结构:

(参数列表) -> {方法体}

参数列表对应的是抽象方法的参数,箭头“->” 是固定位置的固定写法将参数和方法体,->方法体即Lambda主体对应的是抽象方法的实现。

  • 案例
public interface LambdaExample {
    String helloLambda(String param);
}
// test
LambdaExample lambdaExample = (String param) -> {
            System.out.println("第一个lambda语法展示");
            return param;
        };

Lambda语法其他场景实践

通常我们在实际使用Lambda的时候会基于语法结构进行一系列的简化操作(总而言之,能少写点就少写点)

以下案例基于案例LambdaExample

  • 参数类型可以省略
LambdaExample lambdaExample = (param) -> {
            System.out.println("第二个lambda语法展示");
            return param;
        };
  • 抽象方法参数只有一个,可以去掉参数的括号,如果是多个参数不允许哦!
LambdaExample lambdaExample = param -> {
            System.out.println("第三个lambda语法展示");
            return param;
        };
  • 如果方法体只有一行代码如下
LambdaExample lambdaExample = param -> {
            return param;
        };
// 可以将方法体的{}也省略,如果有返回值,那么return也可以省略
// 上述代码最终优化为
LambdaExample lambdaExample = param -> param;

源码

总结

  • 本章主要针对Lambda的概念、语法、基本用法进行一些简要的描述,并提供一些示例代码;
  • Lambda在某些场景允许简化,本章仅对Lambda的语法结构进行简化,后续章节我们会讲述其他简化方案。

关联文章

👉【再学一次系列】

最后

  • 感谢铁子们耐心看到最后,如果大家感觉本文有所帮助,麻烦给个赞👍关注➕
  • 由于本人技术有限,文章和代码可能存在错误,希望大家评论指出,万分感激🙏;
  • 同时也欢迎大家V我一起讨论学习web前端、Java等IT知识,一起卷一起进步。