lambda整理

认识lambda表达式

学习背景:

我是在学习线程的时候,第一次遇见了lambda表达式,当时对于这个知识点还非常的陌生,应该说是从来没见过。于是乎,为了充实自己的之时,我去学习了lambda表达式。

我们先来看一下lambda表达式到底长什么样子

  • 当然,对于我这个小白来说,学习的时候我得先知道这个洋气的东西叫啥呀,一个英语单词,但是不会读。学习的时候,在视频里,我知道搞了半天,这个东西就是数学里常用到的λ。当时的我感到无比的…
  • 举个栗子:()->{System.out.println("msn")}没错,这个东西就是一个lambda表达式,我相信,大家差不多能猜到这句代码是什么意思,就是让控制台输出‘msn’三个字母。

那么,我们通过对这个代码的解释,来了解如何书写lambda表达式

  • 首先,我们要知道什么样的代码才可以使用lambda表达式来化简代码
  • 其次,要知道lambda表达式的书写形式及其解释
lambda表达式的使用情况
  • 一个接口,而且这个接口中只有一个抽象方法,我们可以使用lambda表达式对抽象方法进行重写。比如线程中Runnable接口需要作为Thread的参数时。
    通常情况下,我们需要实现Runnable接口重写run方法,然后创建此实现类的对象,将此对象作为参数传递给Thread;或者使用匿名内部类的方法重写run方法。但是,以上过程可以通过lambda表达式的方式进行代码的简化。

lambda表达式具体实现

  • 范式:(parameter list)->{code block}
  • 说明:
    • parameter list:参数列表。内容是接口中的抽象方法的参数。如果没有参数就空着。参数需要加类型。java11后,参数可以是var类型的。

    • ->:固定写法:相当于表示这一串代码是lambda表达式,这个符号也是意味着指向下面的代码块

    • code block:代码块。我们在抽象方法中具体要执行的代码

      • 注意:lambda表达式中的变量有一些要求,必须是final或者effective final的。
        Local variable a defined in an enclosing scope must be final or effectively final
        这句话是什么意思呢?
        final自然不用多说了,就是常量的意思。code block中可以使用常量。effective final呢?实际的常量,有效的常量,其实就是说,当我们在lambda外定义了一个并不是final修饰的变量,但是这个变量的值赋值一次后并没有发生过改变,则编译器会把这个变量当作一个常量来处理。
        也即是下面几种情况:
        1.定义了一个变量,但是没有赋值,在lambda中不可以使用
        2.定义了一个变量,并且赋值一次,在lambda中可以使用
        3.lambda外定义了一个变量,并且多次赋值,或者进行过++,--等改变值的操作,在lambda不可以使用
        4.在lambda中定义了一个变量,可以进行数值的操作,lambda可以正常使用
        5.定义的final 变量,自然可以使用
    • lambda表达式的缺省规则

      • 当满足特定的条件时,lambda表达式可以省略
        • 可以省略参数的类型。如果有多个参数,不能只省略一个,必须全部省略
        • 如果只有一个参数,可以省略参数的小括号
        • 如果代码块只有一条语句:
          如果没有返回值,可以将大括号和代码后的分号省略
          如果有返回值,在省略大括号和分号后,需要将return省略

lambda表达式注意事项

  • 必须要有接口,接口中只能有一个方法
  • 必须要有上下文环境
    • 当我们使用lambda表达式时,只提供了参数和方法体,所以单独写lambda表达式是不知道实现了哪个类的哪个方法的。又由于lambda表达式中只有一个抽象方法,所以只要提供他是属于哪一个接口的就可以。

      • 因此,使用时,要么使用lambda给一个对象赋值。Runnable r=()->{Syste.out.rintln("aa");}
      • 要么作为参数,而且这个方法的参数是可以根据方法唯一确定的。new Thread(()->{...})
      • 或者作为函数的返回值。因为返回值的类型也是确定的。
      • 或者作为数组的元素。同理
    • 总之,lambda表达式相当于实现了对象接口并创建了其对象的意思。对象能做的,lambda表达式都可以做。

lambda表达式中使用this

因为静态方法中不能使用this,所以要使用lambda表达式中使用this,一定是在一个非静态方法中,而非静态方法的this就是当前对象,所以lambda的this就是当前对象。lambda表达式不开辟新的作用域。与匿名内部类不同。因为使用匿名内部类时也需要new 一个对象,自然this指的是new 的新对象啦

### 大数据分析中的Lambda架构详解 #### Lambda架构概述 Lambda架构是一个实时大数据处理框架,最初由Nathan Marz于2011年提出,旨在解决大规模数据处理需求下的高效能与灵活性问题[^1]。该架构不仅能够支持批量离线处理还能满足实时数据处理的要求。 #### 应用场景 此架构尤其适合那些需要处理海量数据集并且期望获得低延迟查询结果的应用场合,比如用于创建动态更新的仪表盘或是生成即时报表等功能。除此之外,在涉及复杂的数据预处理操作如清洗、转换及汇总等方面表现优异;同样也擅长执行流式计算任务,例如事件驱动逻辑实现、训练机器学习算法模型、识别异常行为模式乃至防范金融诈骗活动等。另外值得注意的是,基于其强大的吞吐能力和灵活扩展特性,Lambda架构常被用来搭建所谓的“数据湖”,即一种可以容纳多种形式原始资料(无论是结构化的还是半/非结构化的)的大规模分布式文件系统,并且对于来自IoT传感器网络所产生的连续不断的信息洪流具备良好的适应能力[^2]。 #### 架构组成部分 整个体系主要分为三个核心部分: - **Batch Layer (批处理层)** 批处理层专注于对过去积累下来的历史记录进行全面而精确地加工整理工作,确保最终得到的结果绝对可靠无误。这一环节通常会采用MapReduce这样的经典技术手段来进行长时间跨度内的全局状态维护。 - **Speed Layer (速度层)** 作为补充机制存在的速度层,则更侧重于捕捉当下正在发生的瞬息万变的新鲜资讯,以便迅速作出反应并向用户提供近似最新的统计概况。这里可能会借助Storm这类专为高速度消息传递优化过的引擎完成增量式的局部修正作业。 - **Serving Layer (服务层)** 最终经过上述两道工序精心打磨后的成品会被送入到服务层当中去供外部调用访问。这一步骤涉及到如何有效地组织管理已有的知识资产使之易于检索利用的问题,往往依赖像Elasticsearch这样优秀的全文搜索引擎来达成目的[^3]。 #### 组件选型策略 当考虑具体的技术栈组合方案时,应当充分认识到视图(View)这个概念在整个流程里扮演着至关重要的角色——它是连接底层基础设施同上层应用界面之间的桥梁纽带。因此,在挑选合适的工具链之前务必要深刻理解待解决问题域内所特有的业务语境及其背后隐藏的价值诉求点所在,进而有针对性地评估候选对象能否很好地契合实际应用场景的具体情况。不同类型的视图可以根据各自特定的任务性质分别选用最匹配的那一款产品或平台,而不必强求统一标准[^4]。 ```python # Python伪代码示例展示了一个简单的Lambda架构模拟过程 from batch_layer import BatchProcessor from speed_layer import SpeedProcessor from serving_layer import ServingLayer def lambda_architecture_simulation(data_stream, historical_data): # 初始化各层次处理器实例 batch_processor = BatchProcessor() speed_processor = SpeedProcessor() serving_layer = ServingLayer() # 对历史数据进行全量处理 processed_historical_data = batch_processor.process(historical_data) # 实时处理新流入的数据片段 real_time_updates = speed_processor.process(data_stream) # 将两者结合起来形成完整的最新视图 combined_view = merge_views(processed_historical_data, real_time_updates) # 更新至服务层以备后续查询请求使用 serving_layer.update(combined_view) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值