【JAVA学习之路 | 进阶篇】Lambda表达式

简介: 【JAVA学习之路 | 进阶篇】Lambda表达式

1.java8新特性 : 函数式接口

什么是函数式接口?

  • 只包含一个抽象方法的接口称为函数式接口.该接口可以包含其他非抽象方法.
  • 可以通过lambda表达式创建该接口的实现类的对象.(lambda表达式抛出受检异常,那么该异常需要在目标接口的抽象方法上进行声明)
  • 我们可以在抽象方法上使用注解,这样做可以检查是否是函数式接口.
  • 在java.util.function包下,定义了java8丰富的函数式接口.

2.冗余的匿名内部类与简洁的lambda表达式

例 :

public class LambdaTest {
    public static void main(String[] args) {
        //实现线程当中提及的Runnable接口,重写了当中的一个抽象方法, 并创建了匿名实现类的对象
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("hexua你太酷啦");
            }
        };
        r1.run();
 
        //如果我们使用lambda表达式,将会非常简洁
        Runnable r2 = () -> {
            System.out.println("hexua你太酷啦");
        };
        r2.run();
        //运行会发现,两种写法运行结果相同
        //hexua你太酷啦
        //hexua你太酷啦
    }
}

接着我们来介绍一下lambda表达式的语法.

3.lambda表达式的语法

lambda表达式 : 在java8中引入了一种新的语法元素和操作符.即"->".该操作符被称为箭头操作符.它将lambda表达式分为两个部分 :


(1)左侧:指定了lambda表达式需要的参数列表.


  (2)  右侧: 指定了lambda体,是抽象方法的实现逻辑.也即lambda表达式要执行的功能.


接下来介绍六种语法格式.

4.语法格式

(1). 无参数, 无返回值类型

@Test
    public void test1() {
        //无参数, 无返回值类型
        Runnable r1 = () -> {
            System.out.println("语法格式-1");
        };
        r1.run();
        //输出和 : 语法格式-1
    }

(2). 需要一个参数, 但是没有返回值

@Test
    public void test2() {
        //需要一个参数, 但没有返回值
        LambdaInterface<String> l1 = (String s) -> {
            System.out.println(s + "tkl");
        };
        l1.show("hexua");
        //输出 : hexuatkl
    }
}
interface LambdaInterface<T> {
    void show(T s);
}

(3). 数据类型可以省略, 因为可以由编译器推断得出, 称为类型推断

@Test
    public void test3() {
        //类型推断, String类型可以省略
        LambdaInterface<String> l1 = (s) -> {
            System.out.println(s + "tkl");
        };
        l1.show("hexua");
        //输出 : hexuatkl
    }
}
interface LambdaInterface<T> {
    void show(T s);
}

(4). 参数列表只有一个参数的情况下, 小括号可以省略

@Test
    public void test4() {
        //参数列表只有一个参数的情况下, 圆括号也可以不写
        LambdaInterface<String> l1 = s -> {
            System.out.println(s + "tkl");
        };
        l1.show("hexua");
        //输出 : hexuatkl
    }
}
interface LambdaInterface<T> {
    void show(T s);
}

(5). 需要两个或两个以上的参数时,多条执行语句, 并且可以有返回值

@Test
    public void test5() {
        LambdaInterface<String> l1 = (s, t) -> {
            System.out.println("我也不知道这里写什么");
            return s + "你过来啊" + t;
        };
        System.out.println(l1.show("hexua", "hexi"));
        //输出 : 我也不知道这里写什么
        //hexua你过来啊hexi
    }
}
interface LambdaInterface<T> {
    String show(T s, String t);
}

(6). 若只有一条语句, return和大括号都可以省略

@Test
    public void test6() {
        //只有一条语句时, return与大括号若有, 都可以省略
        LambdaInterface l2 = () -> "return与大括号都可以省略";//返回值语句
        System.out.println(l2.show());
        //输出 : return与大括号都可以省略
    }
}
interface LambdaInterface<T> {
    String show();
}

5.(重点)四种常见的函数式接口

(1). 消费型接口 : 对类型为T的对象应用操作, 包含方法void accept(T t).

Consumer<T>
抽象方法 : void accept(T t)

(2). 供给型接口 : 返回类型为T的对象, 包含方法T get().

Supplier<T>
抽象方法 : T get()

(3). 函数型接口 : 对类型为T的对象应用操作, 并返回类型为R的对象. 包含方法R apply(T t)

Function<T, R>
抽象方法 : R apply(T t)

(4). 判断型接口 : 确定类型为T的对象是否满意某约束, 并返回boolean值, 包含方法boolean test(T t)

Predicate<T>
抽象方法 : boolean test(T t)
相关文章
|
6月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
364 1
|
7月前
|
Java API 容器
Java基础学习day08-2
本节讲解Java方法引用与常用API,包括静态、实例、特定类型方法及构造器引用的格式与使用场景,并结合代码示例深入解析。同时介绍String和ArrayList的核心方法及其实际应用。
212 1
|
6月前
|
存储 Oracle Java
java零基础学习者入门课程
本课程为Java零基础入门教程,涵盖环境搭建、变量、运算符、条件循环、数组及面向对象基础,每讲配示例代码与实践建议,助你循序渐进掌握核心知识,轻松迈入Java编程世界。
531 0
|
6月前
|
负载均衡 Java API
grpc-java 架构学习指南
本指南系统解析 grpc-java 架构,涵盖分层设计、核心流程与源码结构,结合实战路径与调试技巧,助你从入门到精通,掌握高性能 RPC 开发精髓。
618 8
|
7月前
|
Java
Java基础学习day08-作业
本作业涵盖Java中Lambda表达式的应用,包括Runnable与Comparator接口的简化实现、自定义函数式接口NumberProcessor进行加减乘及最大值操作,以及通过IntProcessor处理整数数组,实现遍历、平方和奇偶判断等功能,强化函数式编程实践。
113 5
|
7月前
|
Java 程序员
Java基础学习day08
本节讲解Java中的代码块(静态与实例)及其作用,深入介绍内部类(成员、静态、局部及匿名)的定义与使用,并引入函数式编程思想,重点阐述Lambda表达式及其在简化匿名内部类中的应用。
197 5
|
7月前
|
Java
Java基础学习day07-作业
本作业包含六个Java编程案例:1)动物类继承与多态;2)加油卡支付系统;3)员工管理类设计;4)学生信息统计接口;5)USB设备控制;6)家电智能控制。综合运用抽象类、接口、继承、多态等面向对象技术,强化Java基础编程能力。
260 3
|
7月前
|
Java
Java基础学习day06-作业
本内容为Java基础学习作业,涵盖两个案例:一是通过Card类及其子类GoldenCard、SilverCard实现加油卡系统,体现封装与继承;二是通过Shape类及子类Circle、Rectangle演示多态与方法重写,强化面向对象编程理解。
129 1
|
7月前
|
设计模式 存储 Java
Java基础学习day07
本节讲解Java中的final关键字、单例设计模式、枚举类、抽象类与接口。涵盖常量定义、单例写法(饿汉式/懒汉式)、枚举特点及应用场景,以及抽象类与接口的使用与区别,助力掌握核心面向对象编程思想。
243 1
|
7月前
|
Java
Java基础学习day05-作业
本文为Java基础学习第五天作业,通过五个案例练习类与对象的定义、构造方法、set/get方法及成员方法的应用。涵盖女友、学生、教师、手机和电影等类的设计与测试,强化面向对象编程基础。
121 2
下一篇
开通oss服务