Java8一Lambda与函数式接口

遥感SCI期刊模板下载教程———IEEE TGRS、GRSL、JSTARS IEEE下的期刊模板下载,以IEEE TGRS 为例。 阅读详情

关于Lambda表示在工作学习中会经常用到,但并没有全面的去了解。在这里做一个较为详细的记录供以后学习查阅。主要参考Java 8 Lambda 表达式

引言


Java8之前,我们在使用Runnale创建线程的时候,经常需要将Runable实例传入new Thread中。一般采用匿名内部类将函数作为参数的形式传入

new Thread(new Runnable() {
    @Override
    public void run() {
        System.out.println("Before Java8,There is no Lambda expression!");
    }
}).start();

之后我们可以使用Java8的新特性Lambda这样写:

new Thread( () -> System.out.println("In Java8, There is Lambda expression!") ).start();

这里相当于:

Runable runable = () -> System.out.println("In Java8, There is Lambda expression!");

可见Lambda表达式的强大之处,下面将以详细记录.


1、Java8的Lambda特性

1、Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
2、Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
3、使用 Lambda 表达式可以使代码变的更加简洁紧凑。

2、Lambda表达式的语法

(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }

比如:

(int a, int b) -> {  return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }

3、Lambda表达式的特征

  • 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
Arrays.asList( "a", "b", "d" ).forEach( e -> System.out.println( e ) );

这里e的类型就是由编译器推理得到的,不需要声明类型,当然也可以声明类型,比如:

Arrays.asList( "a", "b", "d" ).forEach( ( String e ) -> System.out.println( e ) );
  • 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  • 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
Arrays.asList( "a", "b", "d" ).forEach( e -> {
    System.out.print( e );
    System.out.print( e );
} );
  • 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指明表达式返回了一个数值。并且如果Lambda表达式中的语句块只有一行,则可以不用使用return语句

如下两个是一样的效果

Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> e1.compareTo( e2 ) );
Arrays.asList( "a", "b", "d" ).sort( ( e1, e2 ) -> {
    int result = e1.compareTo( e2 );
    return result;
} );

4、Lambda变量作用域

Lambda表达式只能引用外部被final修饰的局部变量,换句话说在Lambda表达式中我们不能修改定义在外的局部变量。

public class LambdaTest {

    public static void main(String[] args) {
        //final如果不写的话,Lambda表达式会默认该变量为final
        final String string="Hello ";

        HelloWorld test = (String message)->System.out.println(message+"World!");
        test.print(string);
    }
    @FunctionalInterface
    interface HelloWorld {
        void print(String str);
        default void print2() {

        }
    }
}

5、函数式接口

(1)在学习函数式接口之前,我们先了解Java8下接口的静态方法与默认方法。

@FunctionalInterface
    interface HelloWorld {
        void print(String str);
        //默认方法,通过实现类直接调用,不需要实现类实现该方法,提高了扩展性!
        default void print2(String message) {
            System.out.println(message);
        }
        //静态方法,直接接口调用。跟普通的static方法是一样的,不需要实现类去调用
        static void print3(String message) {
            System.out.println(message);
        }
    }
  • 默认(default)方法只能通过接口的实现类来调用,不需要实现方法,也就是说接口的实现类可以继承或者重写默认方法。
    这里写图片描述

  • 静态(static)方法只能通过接口名调用,不可以通过实现类的类名或者实现类的对象调用。就跟普通的静态类方法一样,通过方法所在的类直接调用。
    这里写图片描述

(2)了解了Java8的静态方法与默认方法之后,我们可以准确理解函数式接口的定义与特性:

  • 函数式接口(FunctionalImplement)是一种只含有一个抽象方法声明的接口,但是可以有多个非抽象方法的接口。类似于Java中的Marker Interface标记类型接口,比如java.io.Serializable等都是没有方法声明或属性声明的接口,主要用于通过instanceof就直接能探测一个实例是否是一个特定接口的实例。
  • 那么java.lang.Runable即是一种函数式接口,在接口中只有void run()方法。
  • 简单来说之前我们使用的匿名内部类传入参数,实则是使用匿名内部类来实例化函数式接口的对象。而之后的Lambda表达式可以更进一步简化代码

我们在看引言当中利用Runable创建线程的例子,后面写道:

Runable runable = () -> System.out.println("In Java8, There is Lambda expression!");

其实这里就是利用Lambda表达式实现实例化函数式接口的对象,比如我们自定义一个函数式接口,增加注解@FunctionalInterface,也可以不用注解,只需要符合函数式接口的要求,否则会报错!

@FunctionalInterface
interface HelloWold {
    void print();
}

定义好函数式接口之后,我们可以使用Lambda Expression了

public static void main(String[] args) {
    //实现函数式接口的对象
    HelloWold test = ()->System.out.println("HelloWorld!");
    test.print();
}

如果接口不符合要求,则会报错:
这里写图片描述

6、断言(Predicate)函数式接口

Predicate函数式接口的主要作用就是提供一个test方法,接受一个参数返回一个布尔类型,Predicate在Stream API中进行一些判断的时候经常用到。主要用于过滤一些符合条件的逻辑,除此之外还会提供三个defalut方法与一个static方法,具体请看源代码:

@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);

    default Predicate<T> and(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) && other.test(t);
    }

    default Predicate<T> negate() {
        return (t) -> !test(t);
    }

    default Predicate<T> or(Predicate<? super T> other) {
        Objects.requireNonNull(other);
        return (t) -> test(t) || other.test(t);
    }


    static <T> Predicate<T> isEqual(Object targetRef) {
        return (null == targetRef)
                ? Objects::isNull
                : object -> targetRef.equals(object);
    }
}

这里写图片描述

其中经常使用的是default方法test判断输入是否符合某个条件,下面是简单的例子。

//利用test默认方法判断x输入是否大于10
Predicate<Integer> boolValue = x -> x > 10;    
System.out.println(boolValue.test(1));//false    
System.out.println(boolValue.test(11));//true

Predicate断言通常跟Stream一起复合使用。

public class PredicateTest {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
        PredicateTest predicateTest = new PredicateTest();
        //输出大于5的数字
        List<Integer> result = predicateTest.conditionFilter(list, integer -> integer > 5);
        result.forEach(System.out::println);
            System.out.println("-------");
        //输出小于5的数字
        result = predicateTest.conditionFilter(list, integer -> integer < 5);
        result.forEach(System.out::println);
        System.out.println("-------");
        //输出所有数字
        result = predicateTest.conditionFilter(list, integer -> true);
        result.forEach(System.out::println);
        System.out.println("-------");
    }
    //结合使用Stream filter/collect与Predicate
    //filter过滤条件,collect将stream流转换List
    public List<Integer> conditionFilter(List<Integer> list, Predicate<Integer> predicate){
        return list.stream().filter(predicate).collect(Collectors.toList());
    }
}
【100%通过率】华为od统一考试B卷【需要打开多少监视器】JAVA&Go 实现 某长方形停车场,每个车位上方都有对应监控器,当且仅当在当前车位或者前后左右四个方向任意一个车位范围停车时,监控器才需要打开:给出某一时刻停车场的停车分布,请统计最少需要打开多少个监控器 阅读详情

相关推荐

03 Aras Innovator二次开发-服务端方法(二)

Aras Innovator二次开发-服务端方法书写

企业信息化(PLM,ERP.MES) 2017

都2020年了,你还不会用Lambda表达式吗?

Java8新特性之lambda表达式 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本。 Java 8 是oracle公司于2014年3月发布,可以看成是自Java 5 以 来最具革命性的版本。Java 8为Java语言、编译器、类库、开发 工具与JVM带来了大量新特性。 为什么要使用lambda表达式 Lambda 是一个匿名函数,我们可以把 Lambda 表达式理...

qq_44931398的博客 602

开源实战 | 基于SolidWorks与Matlab的并联索驱机器人轨迹规划全流程

本文详细介绍了基于SolidWorks与Matlab的并联索驱机器人轨迹规划全流程,涵盖从基础概念到实战技巧的各个环节。通过SolidWorks建模、Matlab运动学实现及轨迹优化策略,展示了如何实现高精度轨迹规划,适用于摄影、医疗等领域的机器人应用。

weixin_28331555的博客 404

【Java8】函数式接口

一、前言 早期的程序员在JDK1.5时期,掌握泛型、枚举、反射 基本上就可以了,随着JDK不断迭代升级,到相对于稳定的JDK1.8版本,扩展了大量的知识点,例如:lambda表达式,链式编程,函数式接口,Stream流式计算 这些新知识点的出现大大的简化了编程模型,减少了很多冗余代码,代码简洁,清晰明了,并且在迭代出来的底层架构大量得到了应用,所以,我们必须随着主流进行学习,避免阅读源码时都不知道其意。 二、函数式接口(Functional Interface) 函数式接口:只有一个方法的接口.

祝我飞黄腾达 3343

基于大模型的脑疝全流程预测与诊疗方案研究

目录一、引言1.1 研究背景与目的1.2 研究意义1.3 大模型技术概述二、脑疝概述2.1 定义与分类2.2 发病机制与病因2.3 临床表现2.4 诊断方法三、大模型在脑疝预测中的应用3.1 数据采集与预处理3.2 模型训练与选择3.3 模型验证与优化四、术前预测与评估4.1 病情严重程度预测4.2 手术风险预测4.3 个性化手术方案制定4.4 麻醉方案制定五、术中监测与决策5.1 实时监测指标5.2 大模型辅助决策5.3 应对突发情况六、术后评估与护理6.1 术后恢复情况评估6.2 并发症风险预测与预防6

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1285

OpenClaw 超级 AI 实战专栏【实战案例】(五)邮件收发 + 日历日程 + 文件管理一站式搞定

OpenClaw 实现办公自动化核心是模块解耦:邮件收发、文件管理、日历日程各自封装,便于维护和扩展;开发中需重点解决编码兼容、权限配置、时间格式、重复处理四大类坑点,核心思路是 “提前校验 + 异常兜底 + 统一格式”;敏感信息(邮箱密码、API Token)务必通过.env管理,避免硬编码泄露。

qq_36130719的博客 742

Java 8 函数式接口

函数式接口(Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 函数式接口可以对现有的函数友好地支持 lambda。 JDK 1.8 新增加的函数接口: java.util.function java.util.function 它包含了很多类,用来支持 Java的 函数式编程,这里我们只讲四种 接口 描述 Function<T,R> 转换型,将T类型,转换成R类型。return R Consumer&

喵酱 1154

Python地理数据处理 十七:植被物候提取和分析(Savitzky-Golay)

植被是陆地生态系统中最重要的组分之一,也是对气候变化最敏感的组分,其在全球变化过程中起着重要作用,能够指示自然环境中的大气、水、土壤等成分的变化,其年际和季节性变化可以作为地球气候变化的重要指标。此外,由于生态工程保护建设和植被自然生长等因素,中国陆地生态系统发挥了重要的碳汇作用。因此,定量评估植被时空动态变化是制定生态系统可持续发展目标和衡量生态系统固碳潜力的重要前提,卫星遥感数据衍生的生态参量产品为研究长时间序列全球及区域植被时空变化提供了重要数据源。SG滤波能够对物候信息进行平滑,并提取其中的物候信息

amyniez的博客,欢迎交流讨论 4247

Java 8 之函数式接口史上最全详解

Java 8 之函数式接口史上最全详解

qq_25073223的博客 1991

1、 快速掌握R:初学者的计量经济学指南

本博文旨在为初学者提供一个快速掌握R语言的指南,特别是针对计量经济学领域的应用。内容涵盖了R的基本操作、数据管理、可视化、函数编写以及高级统计分析方法,如OLS回归、异方差修正和集群标准误差计算等。通过实际示例和详细说明,帮助读者在数据分析和科学研究中更加得心应手。

weixin_35734408的博客 150

MOS管驱动电路设计全攻略

MOS管驱动电路设计全攻略

让你爱上电路设计 3634

Java 8-函数式接口

Java 8-函数式接口,学习自--https://blog.youkuaiyun.com/hbdhaj/article/details/119564310

伏颜的博客 1667

YOLOv11涨点改进| SCI一区2026 |独家创新首发、特征融合改进篇|引入FAFM特征对齐融合模块,通过特征对齐和融合两个阶段,助力多模态融合小目标检测,小目标检测,SAR图像目标检测高效涨点

🔥本文提出了一种改进YOLOv11网络模型的方法,通过引入FAFM(特征对齐融合模块)来解决多模态目标检测中的特征空间错位问题。FAFM模块采用可变形卷积和内容引导注意力机制,有效实现了跨模态特征对齐与融合,充分利用了不同模态间的互补信息。该方法在保持模型轻量化的同时,显著提升了目标检测精度和鲁棒性,特别是在复杂背景和模态差异较大的场景下表现突出。文章详细介绍了FAFM模块的结构、原理、优势,并提供了完整的代码实现和模型配置方案,为多模态目标检测任务提供了实用的技术参考。

Ai缝合怪、助力小伙伴高效发论文 269

lambda java 接口_Java8一Lambda与函数式接口

关于Lambda表示在工作学习中会经常用到,但并没有全面的去了解。在这里做一个较为详细的记录供以后学习查阅。主要参考Java 8 Lambda 表达式引言Java8之前,我们在使用Runnale创建线程的时候,经常需要将Runable实例传入new Thread中。一般采用匿名内部类将函数作为参数的形式传入new Thread(new Runnable() {@Overridepublic voi...

weixin_42304618的博客 402

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Java8 (一) lambda表达式 和 函数式接口

前言: 目前接触的项目中大量使用Java8的语法、看起来代码十分的简洁、优雅、可能一开始 阅读起来 有些不习惯、但是看的多了以及自己最近自己在写项目的时候用的 多了, 感觉Java8 的这些新的语法是使得目前 java可以 继续活跃在原因之一。 PS:(由于最近一两个月在做项目已经学习一些新知识,导致最近没怎么写blog、最近就开始总结这一两个月学到用到的知识、做个归纳总结) 一、Java8和之前版本简单比较 个人理解: lambda表达式的出现可以替换之前没有函数式接口以及lambda表达式之前的 要实

wuque12138的博客 938

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

java8 lambda 接口_Java8 Lambda(一)-函数式接口(转载)

原文出处:https://cloud.tencent.com/developer/article/1347532函数式接口函数式接口,对于Java来说就是接口内只有一个公开方法的接口,因为使用lanbda表达式,例如() -> user.getName()对应的调用则可能是func.get(),编译器会根据接口推断所属于的方法,如果有两个则无法推断.Java8提供了很多函数式接口,一般都使用...

weixin_36306387的博客 215

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Java8新特性(一) Lambda表达式与函数式接口

Lambda表达式是Java 8中引入的一个重要的新特性,该表达式提出了一种新的语法规则,用于对某些(函数式接口)匿名内部类的书写方式进行简化。除此之外,Lambda表达式是函数式编程思想的一个重要体现,它允许我们通过表达式的形式来定义和传递功能,并且更加关注数据本身。

这里是阿安的博客 1421

java8(一)Lambda表达式使用和函数式接口

举例: 格式说明: Lambda表达式的使用 语法格式 无参,无返回值 一个参数,无返回值 数据可以省略,可以由编译器推断得出(类型推断) 只需要一个参数时,参数的小括号可以省略 需要两个或两个以上参数时,多条执行语句,并可以有返回值 Lambda体只有一条语句时,return与大括号{}都可以省略 Lambda本质 作为函数式接口的实例对象如果一个接口中只声明了一个抽象方法,则该接口称为函数式接口;可以通过Lambda来创建该接口的对象 :声明函数式接口。添加该注解之后,可以作为校验,在该接口中无

qq_29107721的博客 792

Java8新特性(一) Lambda表达式、函数式接口与方法引用

导航 引例 Lambda表达式 格式 格式简化 函数式接口 @FunctionalInterface 四大核心函数式接口 Predicate Consumer Supplier Function 改进 Lambda表达式与变量捕获 方法引用 格式 三类方法引用 静态方法引用 实例方法引用 构造方法引用 引例 有这样一位农场主,他经营着一片苹果园。某天这位农...

戏流年的博客 2039

Java8新特性【一】:概述、Lambda表达式、函数式接口

概述 Java8是自Java5以来最具革命性的版本,为Java语言、编译器、类库、开发工具与JVM带来了大量的新特性。 优势: 速度更快 代码更少(增加了新的语法:Lambda表达式) 强大的Stream API 便于并行 最大化减少空指针异常:Optional Nashorn引擎,允许在JVM上运行JS应用 【一】Lambda表达式 1.格式:左边 -> 右边 -&g...

The_Best_Hacker的博客 279

Java8新特性(一)Lambda表达式之函数式接口

一、自定义函数式接口1、自定义一个函数式接口2、定义一个函数式接口实现类3、实践和理解二、java内置的函数式接口1、JDK 1.8 之前已有的函数式接口2、JDK 1.8 新增加的函数接口:2.1 函数式接口Function2.2 断言接口Predicate2.3消费型接口Consumer2.4 供给型接口Supplier3、其他相关接口及其描述: 一、自定义函数式接口 函数式接口 (Functional Interface) 就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。 函数式...

xuzai 279

Java新特性:Java8函数式接口与Lambda表达式(一)

摘要 何为函数式接口? 什么是lambda表达式,lambda表达式的本质; 函数式接口与lambda表达式的联系:lambda是实现函数式接口的一个快捷方式,可以作为函数式接口的一个实例; 常用Java8内置的函数式接口 Function、Predicate、Consumer 和 Supplier 介绍; 一、函数式接口 何为函数式接口? 函数式接口也是 java interface 的一...

riemann_的博客 604

Java8 学习笔记(一) —— Lambda 表达式 与 函数式接口

先来一段传统的匿名内部类调用程序 //定义一个数学接口 public interface Maths { //定义一个计算的接口方法 int calc(int a, int b); } //测试类 public class MathsTester { //定义一个打印计算结果的方法 public static void printCalcResult(int a,int b,Maths maths){ System.out.println(maths.calc(a, b)); }

q42368773的博客 348

Java8新特性(一) Lambda 表达式(函数式编程)和函数式接口

为什么使用Lambda表达式 避免匿名内部类定义过多 可以让你的代码看起来很简洁 去掉一堆没有意义的代码,只留下核心的逻辑 Lambda表达式 Lambda属于函数式编程,学习Lambda表达式,需要理解函数式接口(Function Interface) 函数式接口的定义:任何接口,如果只包含唯一一个抽象方法,那么他就是一个函数式接口。 使用@FunctionalInterface注解可以检测该接口是否为函数式接口 @FunctionalInterface public interface Cat{

bryce的博客 272

【java8新特性】——lambda表达式与函数式接口详解(一)

一、简介 java8于2014年发布,相比于java7,java8新增了非常多的特性,如lambda表达式、函数式接口、方法引用、默认方法、新工具(编译工具)、Stream API、Date Time API、Optional等 。 当前很多公司的老产品依然使用的java7,甚至开发人员开发新产品时依然没有选择升级, 写关于java8系列文章的目的在于梳理和分享java8新增的主要特性,开发时也可以用作参考。 lambda表达式是java8新增的主要特性之一,lambda表达式又称闭包或匿名函数,主要优点在

qq_43842093的博客 1187

java 8 lambda 函数_Java8函数式编程(一):Lambda表达式类型与常用函数接口

[TOC]1 前言最近在看一些开源项目的源码,函数式编程风格的代码无处不在,所以得要好好学一下了。2 Lambda表达式类型无参数:Runnable noArguments = () -> System.out.println("Hello World!");noArguments.run();一个参数:UnaryOperator oneArgument = x -> !x;Syste...

weixin_35645652的博客 218
上一篇: Spring定时任务基于注解的学习
下一篇: HTML5图片验证及上传实例:学习FileReader/Image
J-Jian
博客等级 码龄9年 48粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值