101.【用了Optional,同事都表示看不懂!】(三)

简介: 101.【用了Optional,同事都表示看不懂!】

6. 类型推断

Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,由编译器推断出来的。这就是所谓的“类型推断”。

说白了就是利用泛型类的特性,直接可以让我们省去类型。

代码示例:

接口

package com.example.springboot01hello.dao;
@FunctionalInterface //表明我们这里是函数式接口,可设可不设。设置的话会提升性能
public interface interface1<String> {
    void show(java.lang.String str);
}

测试

@Test
    public void test3() {
        // 匿名内部类创建 带有泛型参数的
        interface1<String> interface0 = new interface1<String>() {
            @Override
            public void show(String str) {
                System.out.println(str);
            }
        };
        interface0.show("hello");
        // 使用lambda进行改造
        interface1<String> stringinterface1 = (String str) -> {
            System.out.println(str);
        };
        stringinterface1.show("world");
        // 使用lambda进行再次优化, 去掉类型和()与{}
        interface1<String> stringinterface3 = str -> System.out.println(str);
        stringinterface3.show("jsxs");
    }

7.参数传递

我们都知道lambda是一个实例,使用lambda的时候必须要有变量引用,除变量引用外,这样进行方法内的参数传递也是可以的

(1).代码实列一
@FunctionalInterface
interface MyFunc<T> {
    T getValue(T t);
}
public class Test {
    public static void main(String[] args) {
        // str的小括号是可以去掉的
        String abc = toUpperString((str) -> str.toUpperCase(), "abc");
        // String abc = toUpperString(str -> str.toUpperCase(), "abc");
        System.out.println(abc);
    }
    public static String toUpperString(MyFunc<String> consumer, String str) {
        return consumer.getValue(str);
    }
}

将 Lambda 表达式作为参数传递,接收Lambda 表达式的参数类型 必须是 与该 Lambda 表达式兼容的函数式接口的类型。

(2).代码示例二

Java当中很多都是基于参数传递来使用lambda的,就拿集合的forEach来说。

import java.util.Arrays;
import java.util.List;
public class jsxs1 {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5);
        list.forEach(b-> System.out.println(b));
    }
}

8.引用

(1).方法引用

什么是方法引用?

方法引用也是函数式接口的一个实例,通过方法的名字来指向一个方法,可以认为是Lambda表达式的一个语法糖

什么时候使用方法引用?

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!

如下三种主要使用情况:

  1. 对象::实例方法名
  2. 类::静态方法名
  3. 类::实例方法名

格式:使用操作符 “::” 将类(或对象) 与 方法名分隔开来。

ClassName::methodName

使用要求

实现接口的抽象方法的参数列表 和 返回值类型,必须与方法引用的方法的 参数列表 和 返回值类型 保持一致

代码示例一:

Consumer消费型函数,也就是只有入参,没有返回值的。

import java.util.function.Consumer;
public class jsxs1 {
    public static void main(String[] args) {
        // 消费者内部匿名类
        Consumer consumer = new Consumer() {
            @Override
            public void accept(Object o) {
                System.out.println("消费者接口");
            }
        };
        // 创建lamda
        Consumer consumer1 = (x) -> System.out.println(x);
        consumer1.accept("hello");
        // 方法引用
        Consumer consumer2=System.out::print;
        consumer2.accept("world");
    }
}

代码示例二:

Comparator 比较器 函数,有两个入参,和一个返回值。

import java.util.Comparator;
public class jsxs1 {
    public static void main(String[] args) {
        // 1.匿名内部类创建,<Integer>这个泛型一定要带,不然下面就只能是object
        new Comparator<Integer>(){
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1,o2);
            }
        };
        // lambda方式创建,<Integer>这个泛型一定要带,不然报错
        Comparator<Integer> comparator1 = (a, b) -> Integer.compare(a, b);
        System.out.println(comparator1.compare(1, 2));
        // 方法引用,<Integer>这个泛型一定要带,不然报错
        Comparator<Integer> compare = Integer::compare;
        System.out.println(compare.compare(6, 4));  // 判断前面的值是否大于后面的值
    }
}

代码示例三:

BiPredicate是一个判定型的 函数,有两个入参,和一个Boolean返回值。

import java.util.Comparator;
import java.util.function.BiPredicate;
public class jsxs1 {
    public static void main(String[] args) {
        // 这里的<String, String>类型不能丢,因为下面用的是String,如果不声明类型就是Object
        BiPredicate biPredicate = new BiPredicate<String, String>() {
            @Override
            public boolean test(String o, String o2) {
                return o.equals(o2);
            }
        };
        // 这里变量没有声明类型,那么就是Object,equals也是调用的Object的
        BiPredicate biPredicate1 = (a, b) -> a.equals(b);
        // 这里类型必须要写,因为后面写明了调用String的equals
        BiPredicate<String, String> biPredicate2 = String::equals;
    }
}
(2).构造器引用

格式: ClassName::new

与函数式接口相结合,自动与函数式接口中方法兼容。

要求构造器参数列表要与接口中抽象方法的 参数列表一致!且方法的返回值即为构造器对应类的对象。

import java.util.function.Function;
class Teacher {
    private String name;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Teacher(String name) {
        this.name = name;
    }
}
public class Test4 {
    public static void main(String[] args) {
        // 匿名内部类
        Function function = new Function<String, Teacher>() {
            @Override
            public Teacher apply(String name) {
                return new Teacher(name);
            }
        };
        // lambda
        Function<String, Teacher> function1 = (a) -> new Teacher(a);
        // 构造器引用
        Function<String, Teacher> function2 = Teacher::new;
    }
}
(3).数组引用

格式: type[] :: new

public static void main(String[] args) {
    // 匿名内部类
    Function function = new Function<Integer, Integer[]>() {
        @Override
        public Integer[] apply(Integer x) {
            return new Integer[x];
        }
    };
    // lambda
    Function<Integer, Integer[]> function1 = a -> new Integer[a];
    // 数组引用
    Function<Integer, Integer[]> function2 = Integer[]::new;
}
相关文章
|
19天前
|
人工智能 搜索推荐 物联网
告别深夜批改:用Qwen3-VL大模型打造会“理解”的作文阅卷助手
基于Qwen3-VL打造作文阅卷助手,通过对300篇高中作文进行LoRA微调,将教师从繁重批改中解放,更通过即时、客观的反馈助力学生写作能力提升,展现了垂直领域大模型应用的实用价值与高效落地路径。
190 2
|
19天前
|
存储 人工智能 自然语言处理
告别“抽卡式”创作,集之互动定义商业级AIGC视频交付新标准
集之互动推出品牌级AI视频解决方案,以自研“无垠大模型”实现高可控、强贴合、高安全的广告内容生成。通过精准控制、品牌理解、私有化部署与全栈赋能,推动AIGC从技术玩具迈向工业化营销落地,助力企业构建自主、高效、合规的智能内容生产力。
131 1
|
24天前
|
存储 人工智能 数据可视化
最新版:阿里云万小智 AI 建站服务配置与价格说明
阿里云万小智 AI 建站是基于通义大模型开发的一站式建站服务,集成云服务器、存储、CDN 等基础资源,无需专业开发知识即可完成网站搭建。本文详细梳理其不同版本的功能配置、资源规格及收费标准,为用户选择合适的建站方案提供参考。
|
9月前
|
JSON 算法 API
一文掌握 1688 商品详情 API 接口:从入门到实战
1688是国内领先的综合电商批发平台,提供海量商品资源。其商品详情API助力开发者与企业获取商品的详细信息(如属性、价格、库存等),广泛应用于电商数据分析、比价系统及采购场景。API支持GET/POST请求,需传入通用参数(app_key、timestamp等)与业务参数(如product_id)。返回JSON格式数据,包含商品标题、价格、图片链接等详情,提升业务效率与决策精准度。
|
11月前
|
存储 机器学习/深度学习 人工智能
AllData数据中台核心菜单十二:数据同步平台
杭州奥零数据科技有限公司成立于2023年,专注于数据中台业务,维护开源项目AllData并提供商业版解决方案。AllData提供数据集成、存储、开发、治理及BI展示等一站式服务,支持AI大模型应用,助力企业高效利用数据价值。
AllData数据中台核心菜单十二:数据同步平台
快手自动抢红包辅助插件,快手抢红包福袋脚本全自动,智能抢包软件按键版
这是一套快手自动抢红包插件源码,通过模拟点击实现自动化操作。例如准备100个快手账号配合此插件挂机抢红包
|
11月前
|
人工智能 安全 搜索推荐
基于函数计算一键部署 AI 陪练,快速打造你的专属口语对练伙伴
基于函数计算一键部署 AI 陪练,快速打造你的专属口语对练伙伴
|
弹性计算 人工智能 Kubernetes
基于云效 AppStack,5 分钟搞定一个 AI 应用的开发和部署
区别于传统的流水线工具,本实验将带你体验云效应用交付平台 AppStack,从应用视角,完成一个 AI 聊天应用的高效交付。
56176 33
|
缓存 算法 应用服务中间件
[Apache,反向代理,日志,默认值,HTTP]Nginx日志配置详细教程
  nginx日志配置   nginx有一个非常灵活的日志记录模式。每个级别的配置可以有各自独立的访问日志。日志格式通过log_format命令来定义。ngx_http_log_module是用来定义请求日志格式的。   access_log指令   access_log path [format [buffer=size [flush=time]]];   access_log path format gzip[=level] [buffer=size] [flush=time];
700 0
|
机器学习/深度学习 人工智能 文字识别
多模态产品在智能文档处理应用的展望------以TextIn模型为例
**第十四届VALSE大会在重庆举行,合合信息智能创新事业部研发总监常扬分享了“文档解析与向量化技术”,重点介绍TextIn技术。TextIn解决现有文档解析挑战,如表格解析难题,建立包含数据基建、算法、应用和接入四层架构的文档解析Pipeline。关键技术包括版面分析和文档树引擎,能准确识别文档结构和阅读顺序。TextIn在C-MTEB榜单排名第一,显示其在文本向量化领域的优势,适用于长文档处理和多行业应用,有望推动AI技术进步和产业升级。**
475 1