java必须了解的函数式编程及lambda表达式

Java中的函数式编程:从Lambda表达式到Stream API 自Java 8引入函数式编程特性以来,开发者们获得了一种更加简洁、高效的编程方式。函数式编程是指通过将函数作为一等公民的形式来编写代码,减少不必要的样板代码,使代码更加简洁易读,尤其适合于处理集合类数据。Lambda表达式作为Java 8的核心更新之一,为我们提供了更具表现力的方式来定义行为,同时Stream API使得集合的处理变得更加直观和高效。本文深入探讨了Java中的Lambda表达式、方法引用、函数式接口,以及Stream API的强大功能,结合实际案例和详细的代码示例,帮助开发者充分掌握这些特性 阅读详情

什么是函数式编程

在介绍函数式编程前,先了解一下平时我们所使用命令式编程,命令式编程是告诉计算机如何一步一步执行编程风格。
比如我们要在一个苹果的对象集合中筛选出颜色为红色的苹果集合。我们需要写以下代码:

  1. 创建存储苹果的集合list
  2. 遍历这个集合
  3. 判断苹果颜色是不是为红色,如果满足条件,加入结果集合
public static List<Apple> getRedAppleDeclarative(List<Apple> apples) {
    List<Apple> results = new ArrayList<> ();
    for (Apple apple : apples) {
        if("red".equals (apple.getColor ())){
            results.add (apple);
        }
    }
    return results;
}

那么函数式编程是怎样进行操作的呢?函数式编程类似于我们的sql语句

select * from table where 条件语句

只声明我想要什么,以及条件即可

public static List<Apple> getRedAppleFunctional(List<Apple> apples) {
    return apples.stream ().filter (apple -> "red".equals (apple.getColor ())).collect (Collectors.toList ());
}

可以看到通过函数式编程大大简化了代码语句,同时如果对函数式结构熟悉的话,很快便可知道这段代码的含义:stream获取apples集合流—>filter过滤满足的条件—>collect转化为list输出

相比于繁琐的命令式代码,我们函数式编程可以令代码瞬间充满小清新学院风,话不多说,赶紧学习起来以备下次装B之需吧。

通过与数学函数的对比加深理解函数式编程

我们都知道数学的中函数思想,比如根据输入x求的y的值,我们用数学函数表示 y=f(x) = x+10, x为输入,以x+10为结果做为条件
那么用java函数式编程风格可以表示为

 Function<Integer,Integer> function = (x)->{return x+10;};

具体调用:

public static Integer calculate(Function<Integer,Integer> function){
    return function.apply (10);
}
public static void main(String[] args) {
    Function<Integer,Integer> function = (x)->{return x+10;};
    Integer result = calculate (function);
}

在上面的代码中我们看到,main函数中我们定义的function 就是数学中的函数f(x) ,我们把定义好的函数传给方法caculate, caculate中function.apply(10)就相当于我们调用了数学函数f(10).

lambda表达式

我们上面Function接口来表达数据函数f(x) = x+10,这个function就是一个lambda表达式,lamdba表达式由参数箭头和主体构成,基本语法为: (参数)->表达语句
在这里插入图片描述
使用lamdba的好处是非常直观,编程者的意图十分明显的表现在lambda表达式里。
java8为lambda是使用提供了一个function包,提供lambda接口,比如上面我们使用过的Function接口,它的定义是

@FunctionalInterface
public interface Function<T, R> {
    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);

    default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
        Objects.requireNonNull(before);
        return (V v) -> apply(before.apply(v));
    }
    ...
}

可以看到在Function接口中,除了default修饰的方法外,接口中只能有一个方法apply,这也是使用lambda接口的必要条件。他表示给定一个输入T,返回一个输出R,使用lamdba接口时,我们使用表达式来表示实现接口的唯一方法apply()

Function<Integer,Integer> function = (x)->{
  System.out.println("x : "+ String.valueof(x));
  return x+10;
};

lambda表达式的另一种表现形式为 lambda方法引用:

lambda方法引用 通过描述符号 :: 来区分类和方法 ::前面是类名;后面是方法,但是不加()

//lamdba
Predicate<String> q = (String a) -> {
    return a.isEmpty ();
};

使用方法引用来表示的话:

Predicate<String> p = String::isEmpty;

具体调用:

public class LambdaTest {

    public static void lambdaFunc(Consumer<String> consumer, Predicate<String> predicate,String test) {
        boolean condition = predicate.test ("");
        if(condition){
            consumer.accept (test);
        }
    }

    public static void main(String[] args) {
        Predicate<String> p = String::isEmpty;
        Consumer<String> c = System.out::println;
        lambdaFunc (c,p,"test");
    }
}

上面代码表示如果方法参数test不为空,则进行打印

lambda引用还包括 代替函数式接口和构造函数引用

代替函数式接口:
例1:

List<String> testList = Arrays.asList ("a", "b", "A", "B");
//        testList.sort ((s1, s2) -> s1.compareToIgnoreCase (s2));
  testList.sort (String::compareToIgnoreCase);
        System.out.println (testList);

例2:

public static void main(String[] args) {
//  Function<String, Integer> f1 = (String a) -> {return Integer.valueOf (a);};
    Function<String, Integer> f2 = Integer::valueOf;
    Integer result = f2.apply ("2");
    System.out.println (result);
}

Function中的泛型 String代表返回类型,Integer代表输入类型,在lambda引用中会根据泛型来进行类型推断。
构造函数引用:

//方法引用之构造函数引用
public void constructQuote(){
//    Supplier<QuoteClass> s1 = () -> new QuoteClass ();
    Supplier<QuoteClass> s2 = QuoteClass::new;
}

例子中Supplier 返回一个泛型中类的实例。
以上是函数式编程和lambda的介绍,接下来我们会对java中的stream api进行分析,其中涉及的大量的函数式编程的使用。

更多文章,请关注微信公众号:
在这里插入图片描述

Java 函数式编程与 Lambda 表达式 函数式编程是计算机科学的一个重要分支,它强调数据结构和函数的重要性,追求代码的可读性、可维护性和简洁性。函数式编程是使用函数式语言(如Haskell、Scala、F#等)编写的程序,它的核心思想是将程序拆分为一系列小函数,这些小函数实现了程序的业务逻辑。函数式编程的优点包括:提高代码的可读性和可维护性;提高程序的性能和可扩展性;降低程序的出错率。Lambda表达式是函数式编程中的一种重要技术,可以将一个表达式转换为一个函数,使得函数式编程更加灵活。 阅读详情

相关推荐

别再为跨页读写发愁了!STM32F407模拟I2C驱动24C256/512的避坑指南

本文详细解析了STM32F407模拟I2C驱动24C256/512的跨页写入问题,揭示了24C系列存储器'写满一页不会自动翻页'的关键机制,并提供了经过验证的分页写入算法和优化方案。通过GPIO时序优化、地址计算和错误处理等技巧,帮助开发者解决数据错乱、覆盖等常见问题,实现稳定可靠的EEPROM读写操作。

weixin_42631411的博客 376

Lambda之Function

特质 函数,接收一个或多个参数,返回指定类型结果 测试 测试数据 @Data public static class Foo { String strVal = "Hello"; int intVal = 1; Double doubleVal = 2.0; Long longVal = 3L; Boolean trueVal = true; String strTmp; int intTmp = 1; Double doubleTmp; Long longTmp; } 万能

Cocos的博客 2223

[比赛]新冠期间饿了么骑士行为预估-数据理解

写在前面 饿了么的比赛的赛题数据理解。 一、骑士行为数据 courier_id 骑士id wave_index 波次index tracking_id 订单id courier_wave_start_lng 波次起始时刻骑士位置 courier_wave_...

Helslie的博客 2940

(一)Lambda 表达式、函数式(Function)接口

(1)只包含一个抽象方法的接口,称为函数式接口(2)你可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在日标接口的抽象方法上进行声明)。(3)我们可以在一个接口上使用注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。(4)在【java.util.function】包下定义了 Java8 的丰富的函数式接口。

yirenyuan的博客 629

从零配置到批量处理:FaceFusion 3.1完整使用指南(含hififace_256模型测试)

本文详细介绍了FaceFusion 3.1的完整使用指南,包括环境配置、模型选择(特别是hififace_256模型的深度测试)以及批量处理技巧。通过AI驱动的脸部替换技术,帮助用户高效实现高质量的面部处理,适用于影视制作、广告设计等多种场景。

weixin_29056865的博客 655

[Windows] 发票识别工具。支持xml、pdf、ofd文件。

发票识别是财务自动化中的关键环节,支持多种格式(XML、PDF、OFD)的识别工具能显著提升工作效率。以下介绍基于Windows平台开发此类工具的技术方案。发票识别是财务自动化中的关键环节,支持多种格式(XML、PDF、OFD)的识别工具能显著提升工作效率。以下介绍基于Windows平台开发此类工具的技术方案。

pZC_dqux的博客 666

Lamda表达式(二)-Function接口的使用

Java8 添加了一个新的特性Function,顾名思义这一定是一个函数式的操作。我们知道Java8的最大特性就是函数式接口。所有标注了@FunctionalInterface注解的接口都是函数式接口,具体来说,所有标注了该注解的接口都将能用在lambda表达式上。 标注了@FunctionalInterface的接口有很多,但此篇我们主要讲Function,了解了Function其他的操作也就很容易理解了。 @FunctionalInterface public interface Function

qq_32293345的博客 412

Kindle使用USB数据线传书封面无法显示问题

不建议按这个解决封面问题,首先USB多次插拔麻烦,其次就是我起初按博主方法没啥问题,后面无论我怎么个顺序都出现了‘暂无图片’,我的建议是在亚马逊退出国内只能USB传书的情况下,下载一个calibre 和。飞行模式下用calibre传书到kindle ,然后用Fix Kindle Ebook Cover 修复一下,后面你要继续飞行模式还是连网随你便,两步完事。2,‘’发送到设备’的时候也最好选择 ‘发送特定格式至’ 选择具体的电子书格式,你的电子书是azw3就选azw3,是mobi就选mobi。

meser88的博客 7416

Lambda Function (C++, Java, Python)

Lambda Function (C++, Java, Python)

weixin_45646640的博客 489

华为OD机试 - 不含101的数(Python/JS/C/C++ 双机位C卷 100分)

本专栏收录于《华为OD机试真题(Python/JS/C/C++)》。刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注释、3个测试用例、为什么这道题采用XX算法、XX算法的适用场景,发现新题目,随时更新。小明在学习二进制时,发现了一类不含101的数,也就是:现在给定一个正整数区间,请问这个区间内包含了多少个不含101的数?输入的唯一一行包含两个正整数。输出的唯一一行包含一个整数,表示在区间内一共有几个不含101的数。8 1668 → “1000”

学Java,找哪吒 1249

【Agent】AI Agent架构趋势及演进

本文系统介绍了AI Agent架构的发展趋势和技术框架,涵盖单Agent与多Agent系统设计、提示词工程与上下文管理、SpringAI开发框架等关键技术。重点阐述了AI原生应用参考架构,包括Nacos配置管理、Higress AI网关、RocketMQ会话状态管理等核心组件解决方案。同时深入探讨了AI应用可观测性体系,包含OpenTelemetry全链路追踪、关键指标监控以及基于LoongSuite开源工具的数据采集评估方法,为构建高效可靠的AI应用提供了全景式技术参考。

一个内容严谨、方向前沿、极具实践价值的AI大模型技术分享站 1104

Java8 lamda,Function

Lamda/Function lamda表达式 首先介绍下lamda表达式,java1.8开始加入的。 new Thread(()-> { }).start(); findViewById(R.id.firstBtn).setOnClickListener((v)-> { //xxxx }); int x = (i)-> i * i; 我们在android开发中会经常看到这样的提示。 这就是lamda表达式的格式。 定义一个lamda函数式接口 一个接口Interface,需要

jzlhll123的专栏 459

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Lambda表达式

Lambda表达式❓ Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口. lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式或一个代码 块)。 Lambda 表达式(Lambda expression)可以看作是一个匿名函数,基于数学中的λ演算得名,也可称为闭 包(Closure) 语法🚶 基本语法: (parameters) -> expression 或 (parameters)

奋斗 719

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

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java基础知识——22.lambda表达式

在介绍lambda表达式之前,我们先来介绍一下函数式编程。

m0_52096593的博客 1189

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

java系统函数有哪些方法_深入了解java 8的函数式编程

前言关于“Java 8为Java带来了函数式编程”已经有了很多讨论,但这句话的真正意义是什么?本文将讨论函数式,它对一种语言或编程方式意味着什么。在回答“Java 8的函数式编程怎么样”之前,我们先看看Java的演变,特别是它的类型系统,我们将看到Java 8的新特性,特别是Lambda表达式如何改变Java的风景,并提供函数式编程风格的主要优势。函数式编程语言是什么?函数式编程语言的核心是它以处...

weixin_42367472的博客 185

JavaSE-Lambda表达式

目录Lambda表达式初体验函数式编程Lambda表达式的标准格式Lambda表达式的省略写法总结

m0_74462339的博客 254

jdk1.8——Lambda表达式

jdk8,Lambda表达式

FlyLikeButterfly的博客 611

Java面试题:解释函数式编程的概念,并讨论在Java中实现函数式编程的方法

函数式编程在Java中的实现主要依赖于Lambda表达式、方法引用、函数式接口和Stream API等特性。这些功能使Java开发者能够编写更简洁、可读和高效的代码,并且更容易利用并行计算的优势。通过理解和应用这些特性,开发者可以在Java中实现函数式编程的诸多优势。

杰哥在此的专栏 522

Java函数式编程和Lambda表达式

文章目录什么是函数式编程Lambda表达式@FunctionalInterface函数式接口Lambda表达式的格式方法引用 什么是函数式编程 相信大家都使用过面向对象的编程语言,面向对象编程是对数据进 行抽象,而函数式编程是对行为进行抽象。函数式编程让程序员能够写出更加容易阅读的代码。那什么时候函数式编程呢? 函数式编程是一种编程的方法论,主要是将行为编写成一个个的函数。 什么是函数? 函数就是...

程序那些事 1万+

浅谈Java lambda表达式和函数式编程

浅谈Java lambda表达式和函数式编程什么是Java lambda表达式?函数式编程是啥?lambda表达式是函数式编程的一种吗?

菜菜bu菜的博客 2319

Java函数式编程+Lambda表达式

Java8新引入函数式编程方式,大大的提高了编码效率。从面向对象编程视角来看,程序中使用的变量,其实只是一个值的容器,这个容器中,可以放置不同的值。从函数式编程视角,变量其实只是值的一个“别名”,值本身是不能改的。采用函数式编程思想设计类,强调“类”所封装的数据,应该只被初始化一次,之后就不再更改。JDK中的String类型,就是用“函数式编程”风格设计出来的一个例子。Java 8引入了Lambda表达式特性,提供了Stream API。

sjb2274540432的博客 1481

Java函数式编程与Lambda表达式

C++,Java,C#,Python等各个编程语言早已经支持lambda表达式了,作为即将从业的大学生,现在学习Java的函数式编程应该为时不晚。 FunctionalInterface函数式接口 四个最基本的函数式接口 基本数据类型的函数式接口 1double类型的函数式接口 2int类型的函数式接口 3long类型的函数式接口 4boolean类型的函数式接口 一元函数式接口 用于类...

优快云文章已停止维护,后续文章会在 https://blog.hufeifei.cn 持续更新 7081

函数式编程——Lambda表达式与函数式接口

Java 从 Java 8 开始正式引入函数式编程(Functional Programming)支持,核心是通过 ​​ 和 ​​ 实现。

qq_57019146的博客 1032

Java8 Lambda表达式 和 函数式编程 原理详解

前言 1、前言   Java8既JDK1.8。Lambda表达式是Java8的新特性,除此之外Java8还提供了其他新特性,比如:函数式编程、方法引用、Stream、Optional类、默认方法、新的日期类型、Base64、Nashorn, JavaScript 引擎。   本篇详细介绍Lambda表达式,其他的后续慢慢介绍。   它是一个语法糖,糖是甜的,但是对于初学者并不是,当你熟悉之后,你会发现,它是真的香。   Lambda表达式的初衷是,进一步简化匿名类的语法(不过实现上,Lambda表达

Curry4ever 2757

深度探讨Java的Lambda表达式与函数式编程范式

通过深度探讨Lambda表达式及其相关的函数式编程特性,我们不仅仅学会了语法和使用方法,更深入理解了函数式编程的思想。Lambda表达式使得Java更具表达力,代码更为简洁,为开发者提供了更多的选择和灵活性。在实际项目中,合理运用Lambda表达式和函数式编程思想,能够使代码更具可读性、可维护性,提高开发效率。愿读者通过本篇博客,对Java的Lambda表达式有更为深刻的理解。屏幕前的你,祝你今天能够拥有好超级运气!

喔的嘛呀的博客 1330
上一篇: java之rtti(run-time Type identification)类对象
下一篇: java之正则表达式
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值