Lambda表达式深度解析(1)

Lambda表达式深度解析(1)

学习lambda之前,我们先来明确几个概念。

一、 什么是接口函数?

简单来说,接口函数就是,一个接口有且只有一个抽象方法。

接口当中的default方法和static方法,都不影响该接口的效果.

例如:

package com.jiangdeen.lambda.oneday;

/**
 * 1. 接口当中有且仅有一个抽象函数,那么我们就可以把这个这个函数称为接口函数
 * 2. 接口当中的默认(default)方法,不影响接口函数的使用
 * 3. 接口当中的静态函数,也不影响接口函数的使用
 */
public interface Car {

    /**
     * 汽车可以跑
     */
    void run();


    /**
     * 汽车品牌
     *
     * @return
     */
    default String getBrand() {
        return "Volvo";
    }

    /**
     * 汽车类型
     *
     * @return
     */
    static String getType() {
        return "SUV";
    }
}

二、什么是lambda表达式?

lambda 表达式的核心是代码即是数据.

那么,你会问什么是代码即数据?

这里我们就要想一想,在写代码的时候一般都是把数据作为参数,传给一个接口。

lambda表达式,就是把一段代码传给接口,把代码当成数据来处理。

举例:

如果我们做一个用户登陆的接口,用户传过来一个User对象,里面包含usernamepassword,我们接收到了这个对象就去数据库中匹配,并且返回登陆成功或者失败.

public boolean login(User user){
    if("小明".equals(user.getUsername()) && "123456".equals(user.getPassword()){
        return true;
    }
       return false;    
}

那么接口函数就是把这样一个方法,抽象成一个函数,把函数当做数据那样,传来传去.

   public boolean checkUser(String username, String password) {
        Supplier<Boolean> predicate = () -> "小明".equals(username) && "123456".equals(password);
        return predicate.get();
    }

这段代码的核心 () -> "小明".equals(username) && "123456".equals(password); 我们可以把他看成一个行为, 把行为封装成对象,就是lambda的概念.

三、 接口函数和lambda表达式和接口函数是什么关系?

java中接口函数是使用lambda表达式的关键和基础. 是有构造了接口函数才能使用lambda表达式.

接上面的例子:

  1. 有一个汽车接口, 当中有一个抽象方法run(), 那么我们在构建Car这个接口对象的时候,就可以使用lambda表达式来构建. 关键代码 Car car = () -> System.out.println("汽车跑起来了");.
package com.jiangdeen.lambda.oneday;

public class CarTest {

    public static void main(String[] args) {
        // 使用接口函数构造对象
        Car car = () -> System.out.println("汽车跑起来了");
        // 执行run方法
        car.run();
        // 获取汽车品牌, 这个是接口默认方法
        System.out.println(car.getBrand());

        // 获取汽车类型,这辆车是suv
        System.out.println(Car.getType());
    }

}

四、Java中重要的接口函数

这一小节,我们来学习一下,Java中自带的一些重要的接口函数,并且我们日常写代码完全用得上.

接口参数返回类型作用
PredicateTboolean断言型接口
ConsumerTvoid消费型接口
Function<T,R>TR函数型接口
SupplierNoneT共给型接口
UnaryOperatorTT
BinaryOperator(T,T)T

4.1 那么我们来看一下Predicate 的实际应用

 /**
     * 找出所有用户中年龄大于60的人
     */
    public List<User> getAgeThanSixty() {
        User xiaoming = new User("小明", 12, null);
        User xiaohong = new User("小红", 13, null);
        User daming = new User("大明", 61, null);
        return Stream.of(xiaoming, xiaohong, daming)
                .filter(x -> x.getAge() > 60)
                .collect(Collectors.toList());
    }

你可能好奇,这段代码看起来没有用到,Predicate这个类啊?

错了,你可以点进Streamfilter方法去看一看.

image-20240609152640704

filter方法接受的正是一个Predicate对象, 那么x -> x.getAge() > 60这一段函数就代表了predicate对象.

看到这里你是不是对接口函数有了更深一层的了解了呢?

文档中用到的代码: https://github.com/jiangdeen/java8-lambda

法接受的正是一个Predicate对象, 那么x -> x.getAge() > 60这一段函数就代表了predicate对象.

看到这里你是不是对接口函数有了更深一层的了解了呢?

文档中用到的代码: https://github.com/jiangdeen/java8-lambda

  • 52
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值