Java Lambda 表达式提升效率

news2025/5/18 19:11:09
  • lambda 表达式的应用场景

  • Stream 的应用场景

  • Lambda/Stream 的进一步封装

自定义函数式接口(用 jdk 自带的函数式接口也可以)

https://docs.oracle.com/javase/tutorial/java/javaOO/lambdaexpressions.html

import java.io.Serializable;

/**
 * 可序列化的Functional
 *
 * @author VampireAchao
 */
@FunctionalInterface
public interface Func<T, R> extends Serializable {

    /**
     * 调用
     *
     * @param t 参数
     * @return 返回值
     */
    R apply(T t);
}

/**
 * 可序列化的函数式接口实现类
 *
 * @author VampireAchao
 */
public class FuncImpl implements Func<Object, String> {
    /**
     * 调用
     *
     * @param o 参数
     * @return 返回值
     */
    @Override
    public String apply(Object o) {
        return o.toString();
    }
}

  Func<String, Integer> func = new Func<String, Integer>() {
            /**
             * 调用
             *
             * @param s 参数
             * @return 返回值
             */
            @Override
            public Integer apply(String s) {
                return s.hashCode();
            }
        };


Lambda 这种简写的形式

java.util.stream (Java Platform SE 8 )

 Func<String, String> func1 = (String s) -> {
            return s.toUpperCase();
        };

Func<String, String> func2 = (String s) -> s.toUpperCase();
Func<String, String> func3 = s -> s.toUpperCase();
Func<String, String> func4 = String::toUpperCase;

import java.util.function.Function;
import java.util.function.IntFunction;
import java.util.function.Supplier;

/**
 * 语法糖——方法引用
 *
 * @author VampireAchao
 */
public class MethodReferences {

    public static Object staticSupplier() {
        return "whatever";
    }

    public Object instanceSupplier() {
        return "whatever";
    }

    public Object anonymousInstanceFunction() {
        return "whatever";
    }

    public static void main(String[] args) {
        // 引用构造函数
        Supplier<MethodReferences> conSup = () -> new MethodReferences();
        conSup = MethodReferences::new;
        // 数组构造函数引用
        IntFunction<int[]> intFunction = value -> new int[value];
        // intFunc == new int[20];
        int[] intFuncResult = intFunction.apply(20);
        // 引用静态方法
        Supplier<Object> statSup = () -> staticSupplier();
        statSup = MethodReferences::staticSupplier;
        Object statSupResult = statSup.get();
        // 引用特定对象的实例方法
        Supplier<Object> instSup = new MethodReferences()::instanceSupplier;
        instSup = new MethodReferences()::instanceSupplier;
        Object instSupResult = instSup.get();
        // 引用特定类型的任意对象的实例方法
        Function<MethodReferences, Object> anonInstFunc = streamDemo -> streamDemo.anonymousInstanceFunction();
        anonInstFunc = MethodReferences::anonymousInstanceFunction;

    }

}

jdk 自带的函数式接口写法

import java.math.BigDecimal;
import java.util.function.*;

/**
 * 常用的几个函数式接口写法
 *
 * @author VampireAchao
 */
class Usual {

    public static Consumer<Object> consumer() {
        // 有参数无返回值
        return o -> {
        };
    }

    public static Function<Integer, Object> function() {
        // 有参数有返回值
        return o -> o;
    }

    public static Predicate<Object> predicate() {
        // 有参数,返回值为boolean
        return o -> true;
    }

    public static Supplier<Object> supplier() {
        // 无参数有返回值
        return Object::new;
    }

    public static BiConsumer<String, Integer> biConsumer() {
        // 俩参数无返回值
        return (q, o) -> {
        };
    }

    public static BiFunction<Integer, Long, BigDecimal> biFunction() {
        // 俩参数,有返回值
        return (q, o) -> new BigDecimal(q).add(BigDecimal.valueOf(o));
    }

    public static UnaryOperator<Object> unaryOperator() {
        // 一个参数,返回值类型和参数一样
        return q -> q;
    }

    public static BinaryOperator<Object> binaryOperator() {
        // 俩参数和返回值类型保持一致
        return (a, o) -> a;
    }

}

Java 8 API 的抽象称为流 Stream

java.util.stream (Java Platform SE 8 )

    // 声明式编程是告诉计算机需要计算“什么”而不是“如何”去计算
        // 现在,我想要一个List,包含3个数字6
        List<Integer> sixSixSix =
                // 我想要:
                Stream
                        // 数字6
                        .generate(() -> 6)
                        // 3个
                        .limit(3)
                        // 最后收集起来转为List
                        .collect(Collectors.toList());
        sixSixSix.forEach(System.out::print);

//Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。

        // 就像sql里的排序、截取
        // 我要把传入的list逆序,然后从第五个(元素下标为4)开始取值,取4条
        abc = abc.stream()
                // 排序(按照自然顺序的逆序)
                .sorted(Comparator.reverseOrder())
                // 从下标为4开始取值
                .skip(4)
                // 取4条
                .limit(4)
                // 最后收集起来转为List
                .collect(Collectors.toList());
        System.out.println("我要把传入的list逆序,然后从第五个(元素下标为4)开始取值,取4条");
        abc.forEach(System.out::print);
        System.out.println();


  /**
     * 老办法实现一个list,存储3个6
     *
     * @return [6, 6, 6]
     */
    private static List<Integer> oldSix() {
        // 老办法
        List<Integer> sixSixSix = new ArrayList<>(3);
        sixSixSix.add(6);
        sixSixSix.add(6);
        sixSixSix.add(6);
        System.out.println("老办法实现一个list,存储3个6");
        for (Integer integer : sixSixSix) {
            System.out.print(integer);
        }
        System.out.println();
        return sixSixSix;
    }

    /**
     * 新方法实现一个list,存储3个6
     *
     * @return [6, 6, 6]
     */
    private static List<Integer> newSix() {
        List<Integer> sixSixSix = Stream.generate(() -> 6).limit(3).collect(Collectors.toList());
        System.out.println("新方法实现一个list,存储3个6");
        sixSixSix.forEach(System.out::print);
        System.out.println();
        return sixSixSix;
    }

   // 管道中传输,节点中处理
        int pipe = abc.stream()
                // 筛选
                .filter(i -> i > 'G')
                // 排序
                .sorted(Comparator.reverseOrder())
                .mapToInt(Object::hashCode)
                // 聚合
                .sum();
        System.out.println("将26个字母组成的集合过滤出大于'G'的,逆序,再获取hashCode值,进行求和");
        System.out.println(pipe);


//元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作 (terminal operation) 得到前面处理的结果。

        // 将26个大写字母Character集合转换为String然后转换为小写字符
        List<String> terminalOperation = abc.stream()
                // 中间操作(intermediate operation)
                .map(String::valueOf).map(String::toLowerCase)
                // 最终操作(terminal operation)
                .collect(Collectors.toList());
        System.out.println("26个大写字母Character集合,转换成String然后转换为小写字符,收集起来");
        terminalOperation.forEach(System.out::print);
        System.out.println();


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2327990.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能混合编程实践:C++ ONNX进行图像超分重建

人工智能混合编程实践:C++ ONNX进行图像超分重建 前言相关介绍C++简介ONNX简介ONNX Runtime 简介**核心特点**图像超分辨率重建简介应用场景前提条件实验环境项目结构使用C++ ONNX进行图像超分重建sr_main.cpp参考文献前言 由于本人水平有限,难免出现错漏,敬请批评改正。更多…

K8S学习之基础七十四:部署在线书店bookinfo

部署在线书店bookinfo 在线书店-bookinfo 该应用由四个单独的微服务构成&#xff0c;这个应用模仿在线书店的一个分类&#xff0c;显示一本书的信息&#xff0c;页面上会显示一本书的描述&#xff0c;书籍的细节&#xff08;ISBN、页数等&#xff09;&#xff0c;以及关于这本…

Python不可变数据类型全解析:原理、优势与实战指南

目录 引言&#xff1a;为什么Python要区分可变与不可变&#xff1f; 一、不可变数据类型的核心特性 二、五大不可变数据类型深度解析 三、不可变数据类型的三大核心优势 四、不可变数据类型的典型应用场景 五、不可变 vs 可变&#xff1a;如何选择&#xff1f; 六、实战技…

Apache Doris 2025 Roadmap:构建 GenAI 时代实时高效统一的数据底座

在全球 290 位开发者的协作下&#xff0c;Apache Doris 在 2024 年完成了 7000 次代码提交&#xff0c;并发布了 22 个版本&#xff0c;实现在实时分析、湖仓一体和半结构化数据分析等核心场景的技术突破及创新。 2025 年&#xff0c;Apache Doris 社区将秉承“以场景驱动创新…

二极管正负极区分

二极管正负极区分 二极管是一种具有单向导电性的半导体器件&#xff0c;正确区分正负极对于其使用非常重要。以下是几种常见的二极管正负极区分方法&#xff1a; 1. 外观标识 有标记的二极管 色环或色点&#xff1a;许多二极管在表面会有一个色环或色点&#xff0c;这个标记…

【c++深入系列】:类与对象详解(中)

&#x1f525; 本文专栏&#xff1a;c &#x1f338;作者主页&#xff1a;努力努力再努力wz &#x1f4aa; 今日博客励志语录&#xff1a; 不是因为看到希望才坚持&#xff0c;而是坚持了才能看到希望 那么上一篇博客我讲解了什么是类和对象以及类和对象是怎么定义的&#xff0…

汽车 HMI 设计的发展趋势与设计要点

一、汽车HMI设计的发展历程与现状 汽车人机交互界面&#xff08;HMI&#xff09;设计经历了从简单到复杂、从单一到多元的演变过程。2012年以前&#xff0c;汽车HMI主要依赖物理按键进行操作&#xff0c;交互方式较为单一。随着特斯拉Model S的推出&#xff0c;触控屏逐渐成为…

《AI大模型应知应会100篇》第56篇:LangChain快速入门与应用示例

第56篇&#xff1a;LangChain快速入门与应用示例 前言 最近最火的肯定非Manus和OpenManus莫属&#xff0c;因为与传统AI工具仅提供信息不同&#xff0c;Manus能完成端到端的任务闭环。例如用户发送“筛选本月抖音爆款视频”&#xff0c;它会自动完成&#xff1a; 爬取平台数据…

Java 大视界 -- Java 大数据在智能农业无人机植保作业路径规划与药效评估中的应用(165)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

哈希表系列一>两数之和

目录 题目&#xff1a;方法&#xff1a;暴力代码&#xff1a;优化后代码&#xff1a; 题目&#xff1a; 链接: link 方法&#xff1a; 暴力代码&#xff1a; public int[] twoSum(int[] nums, int target) {解法一&#xff1a;暴力解法&#xff1a;int n nums.length;for(int…

CAD插件实现:自动递增编号(前缀、后缀、位数等)——CADc#实现

cad中大量输入一定格式的递增编号时&#xff0c;可用插件实现&#xff0c;效果如下&#xff1a; ①本插件可指定数字位数、起始号码、加前缀、后缀、文字颜色等&#xff08;字体样式和文字所在图层为cad当前图层和当前字体样式&#xff09;。 ②插件采用Jig方式&#xff0c;即…

C语言--回文字符串

输入&#xff1a;字符串&#xff0c;判断是否是回文字符串&#xff0c;例如abcba输出Yes 输出&#xff1a;是否 代码 思路&#xff1a;使用两个指针分别指向头和尾&#xff0c;依次对比第一个元素和最后一个元素&#xff0c;第二个和倒数第二个元素&#xff0c;如果遇到不相同…

Coco-AI 支持嵌入,让你的网站拥有 AI 搜索力

在之前的实践中&#xff0c;我们已经成功地把 Hexo、Hugo 等静态博客和 Coco-AI 检索系统打通了&#xff1a;只要完成向量化索引&#xff0c;就可以通过客户端问答界面实现基于内容的智能检索。 这一层已经很好用了&#xff0c;但总觉得少了点什么—— 比如用户还得专门打开一…

TRDI 公司的RiverPro 和 RioPro ADCP 用户指南

TRDI 公司 RiverPro 和 RioPro ADCP 用户指南 简介第一章 - 概述第二章 - 安装第三章 - 采集数据第四章 - 维护第五章 - 测试RIVERPRO/RIOPRO第六章 - 故障排除第七章 - 将系统返回TRDI进行维修第八章 - 规格第九章 - 命令第十章 - 输出数据格式附录A-合规通知首次完整翻译《Ri…

OpenCV 图形API(11)对图像进行掩码操作的函数mask()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 描述 对矩阵应用掩码。 该函数mask设置来自给定矩阵的值&#xff0c;如果掩码矩阵中对应的像素值设为true&#xff0c;否则将矩阵的值设为0。 支持的源矩阵…

使用C#写的一个Kafka的使用工具

由于offset不支持通过界面推送数据&#xff0c;所以我写了一个kafka的连接工具&#xff0c;能够直接从界面推送数据&#xff0c;方便使用。由于使用的是C#写的&#xff0c;所以比offset要流畅的多。 1、数据源连接 2、获取集群的topic 3、点击获取数据能够获取最新的100条数…

【通知】STM32MP157驱动开发课程全新升级!零基础入门嵌入式Linux驱动,掌握底层开发核心技能!

在嵌入式Linux系统开发中&#xff0c;驱动程序开发是一项关键技术&#xff0c;它作为硬件与软件之间的桥梁&#xff0c;实现了操作系统对硬件设备的控制。相较于嵌入式Linux应用开发&#xff0c;驱动开发由于涉及底层硬件且抽象程度较高&#xff0c;往往让初学者感到难度较大。…

飞浆PaddlePaddle 猫狗数据大战

猫狗数据大战 1 数据集的准备以及处理操作1.1 数据集1.2 文件解压操作&#xff08;python&#xff09; 1.3 数据的分类1.4 创建训练集和测试集 2 网络构建CNN版本--DeepID 人脸识别网络结构DeepID 与 CNN 网络结构的差异 3 深度学习模型训练和推理的核心设置4 制图5 训练6 预测…

使用高德api实现天气查询

创建应用获取 Key 天气查询-基础 API 文档-开发指南-Web服务 API | 高德地图API 代码编写 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-wid…

Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central

具体错误 [ERROR] Failed to execute goal on project datalink-resource: Could not resolve dependencies for project com.leon.datalink:datalink-resource:jar:1.0.0: Could not find artifact com.microsoft.sqlserver:sqljdbc4:jar:4.0 in central (https://repo.maven…