博客
关于我
java基础---JAVA8之lambda表达式以及Stream详解
阅读量:397 次
发布时间:2019-03-05

本文共 3328 字,大约阅读时间需要 11 分钟。

Java8 Lambda表达式详解

一. 问题

  • 什么是lambda表达式?

    Lambda表达式是Java8引入的一种匿名函数表达式,直接对应于数学中的λ演算。它允许在不声明函数名称的情况下,定义匿名函数,适用于函数式编程。

  • lambda表达式用来干什么的?

    Lambda表达式用于替代传统的匿名内部类,简化代码结构,提高代码的可读性和执行效率。在集合操作中,lambda表达式可以用于过滤、映射、排序等操作,极大地提升了程序的简洁性。

  • lambda表达式的优缺点?

    • 优点
      • 代码简洁,逻辑清晰。
      • 代码执行效率较高。
      • 支持函数式编程,提升了程序的可读性。
    • 缺点
      • 代码可读性较差,对于不熟悉lambda表达式的开发者而言,可能会导致理解困难。
      • 对于复杂的逻辑操作,lambda表达式可能显得不够直观。
  • lambda表达式的使用场景?

    • 当需要定义一个匿名函数时,特别是作为函数式接口(Functional Interface)的实现。在Java8中,函数式接口是一个带有且仅有一个抽象方法的接口。
  • lambda只是一个语法糖吗?

    Lambda表达式并不是简单的语法糖,而是Java8为函数式编程引入的一种新的编程范式。它允许开发者以更高效和简洁的方式定义函数,同时在底层生成特定的机器码,使得代码执行效率更高。


  • 二. 概念

    1. 为什么需要 Stream

    Stream是Java8中的一个核心概念,它与传统的InputStream有本质的区别。Stream是一种对集合操作的增强版本,专注于对集合元素进行高效的聚合操作(aggregate operation)。Stream的核心特点包括:

    • 支持串行和并行执行。
    • 可以处理无限数据源。
    • 依赖Lambda表达式,实现高效的函数式编程。

    2. 聚合操作

    聚合操作是Stream中最核心的概念之一。它包括对元素集合进行过滤、映射、排序、汇总等操作。例如:

    • filter:过滤满足条件的元素。
    • map:对元素进行变换。
    • sort:对元素进行排序。
    • reduce:对元素进行归约操作,生成最终结果。

    3. Lambda表达式

    Lambda表达式的语法简洁,形式为:

    (parameters) -> expression  或  (parameters) -> { statements; }
    • 参数推导:编译器会根据上下文自动推导参数类型。
    • 返回类型:lambda表达式的返回类型与上下文中的目标类型一致。

    4. Stream的构成

    Stream可以看作是对集合的一种增强版本。它的主要特点包括:

    • 流水式处理:Stream中的元素只能单向处理,不能逆向遍历。
    • 并行处理:Stream支持并行执行,利用多核处理器的优势。
    • 高效聚合:Stream通过中间操作和终点操作完成数据处理。

    三. 示例

    1. 使用Lambda表达式实现Runnable

    传统的Runnable代码:

    public class RunableTest {    public static void runSomeThing() {        Runnable runnable = new Runnable() {            @Override            public void run() {                System.out.println("I am running");            }        };        new Thread(runnable).start();    }    public static void runSomeThingByLambda() {        new Thread(() -> System.out.println("I am running")).start();    }}

    2. 使用Lambda表达式实现Comparator

    传统的Comparator代码:

    public class SortList {    private static List
    list = Arrays.asList("my","name","is","uber","and","uc"); public static void oldSort() { Collections.sort(list, new Comparator
    () { @Override public int compare(String a, String b) { if (a.charAt(1) <= b.charAt(1)) { return 1; } else { return -1; } } }); } public static void newSort() { Collections.sort(list, (a, b) -> a.charAt(1) < b.charAt(1) ? 1 : -1); }}

    四. 来由

    1. Lambda表达式的优势

    • 代码简洁:减少了冗余的匿名类定义。
    • 逻辑清晰:使程序结构更加直观。
    • 高效执行:编译器为lambda表达式生成高效的机器码。

    2. Lambda表达式的应用场景

    • 内部匿名类:可以替代匿名内部类。
    • 集合操作:在Stream中使用lambda表达式进行过滤、映射、排序等操作。

    五. 什么时候可以使用它?

    1. 函数式接口

    函数式接口是lambda表达式的核心应用场景。

    • 定义:一个接口中只有一个抽象方法。
    • 示例Comparator, ActionListener, Runnable等。

    2. 使用场景

    • 需要定义一个匿名函数,但不需要赋予函数一个名称。
    • 需要对集合或数组进行高效的聚合操作。

    六. 写法、规则

    1. 基本语法

    lambda表达式的语法形式为:

    (parameters) -> expression  或  (parameters) -> { statements; }
    • 参数推导:编译器会根据上下文自动推导参数类型。
    • 返回类型:lambda表达式的返回类型与上下文中的目标类型一致。

    2. 方法引用

    方法引用是lambda表达式的一种常见形式。

    • 静态方法引用ClassName::methodName
    • 实例方法引用instanceReference::methodName
    • 超类方法引用super::methodName
    • 构造方法引用Class::new

    七. 特性

    1. 类型推导

    lambda表达式的类型由上下文决定,编译器会自动推导参数类型,减少了手动指定类型的需求。

    2. 变量捕获

    在Java SE 8中,lambda表达式允许对局部变量进行捕获,但要求这些变量必须是有效只读的(Effectively final)。

    3. 方法引用

    方法引用允许直接调用类、实例或超类的方法,简化了代码逻辑。

    4. Java提供的SAM接口

    SAM(Specific Abstract Method)接口是Java8为lambda表达式设计的特殊接口,用于定义函数式操作。


    八. 优缺点

    优点

    • 代码简洁:减少了冗余代码。
    • 执行效率高:编译器生成的机器码优化了执行效率。
    • 支持函数式编程:提升了程序的可读性和简洁性。

    缺点

    • 可读性差:对于不熟悉lambda表达式的开发者而言,代码可能显得难以理解。
    • 依赖函数式思维:需要开发者转变思维方式,理解函数式编程的核心思想。

    九. 语法糖吗?

    lambda表达式并不是简单的语法糖。它是Java8为函数式编程引入的一种新编程范式,允许开发者以更高效和简洁的方式定义函数,同时在底层生成特定的机器码。

    转载地址:http://nxczz.baihongyu.com/

    你可能感兴趣的文章
    oracle从备份归档日志的方法集中回收
    查看>>
    oracle优化器analyzed,Oracle 学习之 性能优化(十三) 索引
    查看>>
    Oracle修改字段类型
    查看>>
    Oracle修改表或者字段的注释
    查看>>
    oracle典型安装失败,安装oracle 10失败
    查看>>
    Oracle内存结构详解(四)--Oracle SGA其他组成部分
    查看>>
    Oracle函数与存储过程和程序包
    查看>>
    Oracle分析函数之LEAD和LAG
    查看>>
    Oracle分组取前n条记录
    查看>>
    Oracle分页sql
    查看>>
    Oracle创建database link(dblink)和同义词(synonym)
    查看>>
    oracle创建数据库的步骤
    查看>>
    Oracle创建用户、角色、授权、建表
    查看>>
    Oracle创建用户与授予表空间与权限
    查看>>
    oracle创建表(并且实现ID自增)
    查看>>
    oracle创建视图与生成唯一编号
    查看>>
    oracle删除重复数据保留第一条记录
    查看>>
    oracle判断空值的函数nvl2,【PL/SQL】 NVL,NVL2,COALESCE 三种空值判断函数
    查看>>
    Oracle发布VirtualBox 7.1稳定版!支持ARM、优化了UI、支持Wayland等
    查看>>
    oracle启动三步
    查看>>