Java8特性:lambda表达式

掌握Java 8新特性:Stream API与Lambda表达式 Java 8,作为Java历史上一次重大的更新,引入了诸多改变游戏规则的新特性,这些特性不但提升了开发效率,还极大地扩展了Java语言表达能力。其中,Lambda表达式、Stream API、新的日期时间API、Optional类等成为Java 8最大的亮点。这些特性标志着Java从面向对象编程向函数式编程迈出了重要的一步。本章将对Java 8的这些核心特性进行概览,并简要介绍它们各自的特点与作用。 阅读详情

作为一个稀有的Java妹子,所写的所有博客都只是当作自己的笔记,留下证据自己之前是有用心学习的~哈哈哈哈(如果有不对的地方,也请大家指出,不要悄悄咪咪的不告诉我)

一、概述

以前我们在实现接口时,一般是写一个实现类,然后重写需要调用的方法,如果不想创建实现类,就使用匿名内部类来重写方法。

public interface MyInterface {
    void test();
}

实现类重写方法

public class MyInterfaceImpl implements MyInterface {
    @Override
    public void test() {
        System.out.println("重写了该方法!!");
    }
}

匿名内部类重写方法

 MyInterface myInterface = new MyInterface() {
            @Override
            public void test() {
                System.out.println("匿名内部类重写方法!!!");
            }
        };

在有了lambda表达式后,可以简化接口的实现,达到不创建新的实现类和使用匿名内部类,使用简单的代码就可以实现接口。

 MyInterface myInterface1 = () -> System.out.println("lambda重写方法");

二、lambda表达式的格式

(params…) -> {operation}
表达式分为三个部分:
1.左边是参数,即接口方法的入参,如果是无参的,就只需要(),参数的类型可以省略不写
2.中间的是lambda的符号,-> 意为(gose to)
3.右边是方法实现的方法体,就相当于我们实现接口时,在方法体中写的代码,如果只有一句,则可以不要{},有返回值的也不需要return;如果有多句代码,则需要大括号,有返回值的接口,需要加上return;

三、Java内置的函数式接口

1、函数式接口:在jdk8以前,接口只能有抽象方法,不能有带有方法体的方法,但是在jdk8之后,接口也可以有非抽象方法,只需要在方法定义时,加上default,如果接口只能有一个抽象方法,在接口加上@FunctionalInterface注解,只有一个抽象方法的接口叫做函数式接口。
2、内置的函数式接口,关注每个接口的方法,主要区别就是方法的参数和返回值,这样我们就可以不用自己去定义接口,只需要使用lambda表达式去实现它。

(1)、

@FunctionalInterface
public interface Comparator<T> {
      int compare(T o1, T o2);
}

以前需要排序集合的做法

List<User> list = new ArrayList<>();
User user1 = new User("里斯",16);
User user2 = new User("嗷嗷",56);
User user3 = new User("哈哈",23);
User user4 = new User("奥奥",16);
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
list.sort(new Comparator<User>() {
      @Override
      public int compare(User o1, User o2) {
          if(o1.getAge()>o2.getAge()){
                return 1;
          }else if(o1.getAge().equals(o2.getAge())){
               return 0;
           }else {
                return -1;
           }
   }

使用lambda表达式

 list.sort((u1,u2) -> Integer.compare(u1.getAge(),u2.getAge()));

这里我们看到方法的实现是调用了另一个方法,前提是这个方法和需要实现的方法参数和返回值一样,

public static int compare(int x, int y) {
        return (x < y) ? -1 : ((x == y) ? 0 : 1);
    }

(2)、

@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);
    
 }

这个接口有一个参数,返回值为boolean,来看一下这个接口在Collection接口中的用法

//这个方法是移除集合中满足条件的元素,注意这个方法是在接口中,所以加了default后就可以有方法体了。
default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }

以前的调用形式

List<User> list = new ArrayList<>();
User user1 = new User("里斯",16);
User user2 = new User("嗷嗷",56);
User user3 = new User("哈哈",23);
User user4 = new User("奥奥",16);
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
//使用匿名内部类来实现方法
list.removeIf(new Predicate<User>() {
    @Override
    public boolean test(User user) {
        if(user.getAge()>20){
              return true;
         }
        return false;
     }
});

使用lambda表达式:

List<User> list = new ArrayList<>();
User user1 = new User("里斯",16);
User user2 = new User("嗷嗷",56);
User user3 = new User("哈哈",23);
User user4 = new User("奥奥",16);
list.add(user1);
list.add(user2);
list.add(user3);
list.add(user4);
//表达式左边是参数u,类型可以省略,不省略的话就是User u,右边是方法体,
//返回的是boolean值,可以看到参数和返回值与Predicate接口的test
//方法是一致的。
list.removeIf(u -> u.getAge()>20);

(3)、

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}

集合的foreach方法参数是这个接口,循环集合的元素,然后调用了该接口的accept方法。

 default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }

使用lambda表达式循环输出集合元素

list.forEach(System.out::println);

println方法入参和返回值与accept一样,可以使用该方法的方法体直接实现accept方法。

public void println(Object x) {
        String s = String.valueOf(x);
        synchronized (this) {
            print(s);
            newLine();
        }
    }

注意:
::双冒号可以调用接口的方法

无人机航拍图像匹配——SIFT算法实践(含代码) 阅读详情

相关推荐

使用VNC可视化Docker容器

Docker容器可视化

Robert_Q的博客 1万+

Predicate和Consumer的简单使用

Predicate.test和Consumer.accept接口定义 @FunctionalInterface public interface Predicate<T> { /** * Evaluates this predicate on the given argument. * * @param t the input argument * @return {@code true} if the input argument matc

积累与备忘 446

Excel VBA--按某一列拆分数据到多个文件

首先,将需要拆分的sheet命名为“明细”,接下来运行此代码,按提示操作即可。 在这里插入代码片 Sub chaifen() '定义变量类型 Dim sht, sh1, sh2 As Worksheet Dim k, i, j As Integer Dim irow As Integer Dim col As Integer Dim str As String '程序开始是要求输入按哪一列拆分数...

weixin_43650026的博客 5871

[Java 8] Predicate、Consumer、Supplier、Function

Predicate是Java中的一个函数式接口,它代表一个输入参数并返回一个布尔值的函数。它通常用于对集合或流中的元素进行条件判断、筛选和过滤操作。Predicate该方法接受一个泛型参数 T 的输入参数,并返回一个布尔值。当输入参数满足某个条件时,test()方法返回 true,否则返回 false。

weixin_42704512的博客 1179

【低空经济】低空无人驾驶航空器运行管理系统设计方案

低空无人驾驶航空器运行管理系统(以下简称“系统”)旨在为低空域内的无人驾驶航空器(UAV)提供高效、安全、智能的运行管理服务。系统通过集成先进的通信、导航、监控、数据处理和人工智能技术,实现对低空域内无人驾驶航空器的实时监控、动态调度、风险评估和应急响应,确保其在复杂空域环境中的安全运行。系统的核心功能包括空域管理、飞行计划审批、实时监控、冲突预警、应急管理和数据分析。空域管理模块负责划分和管理低空域资源,确保不同飞行任务之间的空域隔离和高效利用。

2502_92579126的博客 1140

AIDC供电系统与算电协同

AIDC供电系统的技术革新为算电协同提供了基础保障,而算电协同则是解决AIDC高能耗问题、推动数字经济可持续发展的关键路径

数据中心全生命周期价值管理 2564

函数式接口 Consumer、Function、Supplier、Predicate的理解与应用

函数式接口(Functional Interface)是只有一个抽象方法的接口,但是可以有多个非抽象方法。函数式接口可以被隐式的转换为Lambda表达式,基于这个特性就可以实现直接将函数作为数据进行传递。通过检查该接口是否有@FunctionalInterface注解,判断该接口是否是一个函数式接口,如果是,编译通过;如果不是,则编译失败。

qq_14962815的博客 6503

手把手教你用STM32的SPI驱动MCP2517FD实现CAN FD通信(附完整代码)

本文详细介绍了如何使用STM32通过SPI驱动MCP2517FD实现CAN FD通信,涵盖硬件连接、SPI驱动编写、寄存器配置及数据收发实战。提供完整代码示例和常见问题排查指南,帮助开发者快速构建高可靠性的CAN FD通信系统,适用于汽车电子和工业控制等领域。

weixin_30607029的博客 674

死磕Lambda表达式(六):Consumer、Predicate、Function复合

JDK不仅提供的这些函数式接口,其中一些接口还为我们提供了实用的默认方法,这次我们来介绍一下Consumer、Predicate、Function复合。

万猫学社 1万+

嵌入式通信协议框架的四层架构设计与实现

本文详细介绍一种模块化的嵌入式通信协议框架设计,采用四层架构:硬件抽象层统一管理数据收发与缓冲,隔离硬件差异;协议管理层通过特征识别自动路由多协议数据,支持动态扩展;协议处理层独立实现各协议解析/构建,确保校验安全与零拷贝效率;应用层采用表驱动模式处理业务逻辑,与协议细节解耦。 该架构已应用于工业控制等领域,具备强类型安全、高扩展性和平台无关性特点,显著提升复通信场景下的开发效率与系统可靠性。提供完整代码实现与设计要点分析,助力开发者构建高效通信栈。

Bit_Dong的博客 2464

移动支付APP(仿支付宝)

Toast.makeText(PayActivity.this, "支付失败:" + payResponse.getMsg(), Toast.LENGTH_SHORT).show();Toast.makeText(PayActivity.this, "支付失败:" + t.getMessage(), Toast.LENGTH_SHORT).show();Toast.makeText(PayActivity.this, "支付失败", Toast.LENGTH_SHORT).show();

寒寒豆豆软件公司的博客 134

【JAVA8】快速理解Consumer、Supplier、Predicate与Function

快速理解Consumer、Supplier、Predicate与Function 一、前言 这几个接口都处在java.util.function包下,Consumer(消费型),Supplier(供给型)、Predicate(判断型)与Function(转换型),暂时不理解他们的类型没关系。 如果对Lambda不怎么理解的同学,可以先移步到...

阳阳的博客 2万+

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

网神 SecGate 3600 防火墙 app_av_import_save文件上传漏洞(含批量验证poc)

weixin_43567873的博客 296

第八章:Java8新增特性,Lambda表达式

7.7.8函数式接口 四大内置函数式接口:java.util.function 1.Consumer<T> 消费型接口 void accept(T t) 有参数没返回值 2.Function<T,R>函数型接口 R apply(T t) 有参数有返回值 3.Supplier<T> 供给型接口 T get() 无参数无返回值 4.Predicate<T> 段言型接口 boolean test(T t) 有参数有返回值,返回布尔类型 public c

ALanLuoYuHang的博客 469

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java 入门指南:Java 8 新特性 —— Lambda 表达式

Java Lambda 表达式是 Java 8 引入的一个功能,它允许以更简洁的方式编写函数式接口的实现。 Lambda 表达式可以被认为是一种匿名函数,它没有名称,但有参数列表、函数体和可能的异常列表。它可以用来替代使用匿名内部类实现函数式接口的方式 Lambda 表达式可以简化代码,使代码更加简洁、可读性更强,尤其在使用函数式接口和结合 Java Stream API 进行编程时非常有用。

热带鱼的技术博客 2146

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Java8新特性: lambda 表达式介绍

lambda表达式是 Java 8 的一个新特性,可以取代大部分的匿名内部类,简化了匿名委托的使用,让你让代码更加简洁,优雅。比较官方的定义是这样的:lambda 表达式是一个可传递的代码块(或者匿名函数),可以在以后执行一次或多次。这个匿名函数没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。lambda表达式也可称为闭包。在 Java 中传递一个代码段并不容易,你不能直接传递代码段。...

lt_xiaodou的博客 1200

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Java8新特性:Lambda表达式

Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。

PandaMan~的博客 1948

Java 8 新特性: Lambda 表达式

我们可以自定义一个函数式接口,并使用 Lambda 表达式来实现它。lambdaInterfaceDemo(() -> System.out.println("自定义函数式接口"));// 函数式接口参数i.f();

qq_33326733的博客 1155

Java 8 新特性:Lambda 表达式

Lambda 表达式 一.为什么Java 需要Lambda 表达式? 二.函数式接口 三.Lambda表达式 四.函数式通用接口的出现 …………

Promise Sun special column 9046

JAVA8新特性一:lambda表达式

大家好,最近入职了新的公司,所以很久都没有写新博客了(其实就是懒) 新公司大量的使用了一些JAVA8的新特性,所以也恶补了一下JAVA8的知识(好吧我知道JAVA14都出来了我还在写JAVA8的特性确实有点落伍了)但最近看了一下实战系列的JAVA8实战,感觉很受启发,作者的高度带给了我不一样的角度来看这些特性。 新特性一:Lambda表达式 Lambda表达式概述 首先让我们来康康JAVA8最大的...

B君的军火库 2217

Java 8新特性:Lambda表达式

通过调用stream方法将列表转换为一个流,然后使用map方法传入Lambda表达式(str -> str.length())作为参数,将列表中的每个字符串映射为其对应的长度。首先,创建一个包含字符串的列表strings,其中包含了"Java"、“Python”、"C"和"JavaScript"四个元素。通过调用stream方法将列表转换为一个流,然后使用reduce方法传入初始值0和Lambda表达式(a, b) -> a + b作为参数,将列表中的所有元素累加求和。三、Lambda表达式的使用场景。

weixin_65837469的博客 501

Java 8 新特性:Lambda 表达式与 Stream 流,重构你的编码效率(上篇:Lambda 表达式)

Java 8 引入的 Lambda 表达式和 Stream API 彻底革新了数据处理方式。Lambda 简化了函数式接口的使用,使代码更精炼;而 Stream 提供了强大的集合操作能力,支持函数式编程风格。本文将快速带领你掌握这两项特性,展示如何用更少的代码做更多的事情,提升开发效率和代码质量,让编程成为一门艺术。无论你是新手还是资深开发者,都将受益于这一现代 Java 编程之旅。

欢迎来到我的技术空间!我是一名经验丰富的Java开发工程师,热衷于分享我在软件开发领域的知识和心得。在这个博客里,您会发现一系列关于Java编程的文章,包括最佳实践、技术趋势、代码优化技巧以及一些有趣的项目案例。无论是初学者还是有经验的开发者,都能在这里找 1640

掌握Java 8新特性:Lambda表达式与Stream API详解

大家好,我是默语,擅长全栈开发、运维和人工智能技术。在本篇博客中,我将详细介绍Java 8中的两大核心新特性:Lambda表达式和Stream API。这些特性不仅简化了代码编写,还提高了程序的可读性和性能。通过深入的研究和代码示例,希望能帮助大家更好地掌握这些新特性,提升Java编程水平。关键词:Java 8、Lambda表达式、Stream API、新特性、代码示例。Lambda表达式是Java 8中引入的一个重要特性,用于简化匿名内部类的写法。它允许将函数作为参数传递,提高了代码的简洁性和可读性。

沉淀所学,分享所思,让热爱与成长同行。商务记录AI实战经验,助力开发者快速成长。 热爱AI,希望做出有影响力的技术成果。 技术点亮生活,分享连接价值与机会。 专注AI落地实战,陪你走好技术每一步。 5万+

Java 8新特性探索:Lambda表达式与Stream API的深度解析

在Java 8之前,Java主要是一种面向对象的编程语言,尽管它支持匿名内部类,但在处理一些简单的回调或事件监听时,代码往往显得冗长且不够直观。Lambda表达式的引入,正是为了解决这一问题,它允许开发者以一种更加简洁、函数式的方式编写代码。Lambda表达式本质上是一个匿名函数,它没有名称,但有参数列表、函数体以及可能的返回类型。或。这种简洁的语法使得代码更加紧凑,易于阅读和维护。Stream API是Java 8中另一个引人注目的新特性,它提供了一种高效且易于使用的数据处理方式。

190
上一篇: Java接口有多个实现类,根据不同的业务场景创建不同的实现类实例
下一篇: Java接口有多个实现类,按照排序调用每个实现类重写的方法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值