博客
关于我
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/

    你可能感兴趣的文章
    Objective-C实现A-Star算法(附完整源码)
    查看>>
    Objective-C实现abbreviation缩写算法(附完整源码)
    查看>>
    Objective-C实现ABC人工蜂群算法(附完整源码)
    查看>>
    Objective-C实现activity selection活动选择问题算法(附完整源码)
    查看>>
    Objective-C实现AC算法(Aho-Corasick) 算法(附完整源码)
    查看>>
    Objective-C实现adaboost算法(附完整源码)
    查看>>
    Objective-C实现Adler32算法(附完整源码)
    查看>>
    Objective-C实现AES算法(附完整源码)
    查看>>
    Objective-C实现AffineCipher仿射密码算法(附完整源码)
    查看>>
    Objective-C实现aliquot sum等分求和算法(附完整源码)
    查看>>
    Objective-C实现all combinations所有组合算法(附完整源码)
    查看>>
    Objective-C实现all permutations所有排列算法(附完整源码)
    查看>>
    Objective-C实现all subsequences所有子序列算法(附完整源码)
    查看>>
    Objective-C实现AlphaNumericalSort字母数字排序算法(附完整源码)
    查看>>
    Objective-C实现alternate disjoint set不相交集算法(附完整源码)
    查看>>
    Objective-C实现alternative list arrange备选列表排列算法(附完整源码)
    查看>>
    Objective-C实现An Armstrong number阿姆斯特朗数算法(附完整源码)
    查看>>
    Objective-C实现anagrams字谜算法(附完整源码)
    查看>>
    Objective-C实现ApproximationMonteCarlo蒙特卡洛方法计算pi值算法 (附完整源码)
    查看>>
    Objective-C实现area under curve曲线下面积算法(附完整源码)
    查看>>