JDK1.8-Lambda表达式

一、Lambda表达式及函数式接口介绍

1. 描述

Lambda表达式是Java8中最重要的新功能之一。使用Lambda表达式可以替代只有一个抽象函数的接口实现, 告别匿名内部类,代码看起来更简洁易懂。Lambda表达式同时还提升了对集合、框架的跌代、遍历、过滤数据的操作。

2. 特点

  • 函数式编程
  • 参数类型自动推断
  • 代码量少,简洁

3. 如何学习

  • 熟悉泛型
  • 多练, 多用Stream API

4. Lambda表达式使用场景

  • 任何有函数式接口的地方
  • 函数式接口: 只有一个抽象方法的接口, 排除 Object中的方法, default, static修饰的方法.

5. 函数式接口定义

  1. 定义只有一个抽象方法的接口
  2. 在接口上加注解@FunctionalInterface

示例

@FunctionalInterface
public interface DemoLambda2 {

    int delete();

    // Object中的方法不包括
    public int hashCode();

    // default修饰的不包括
    default int insert(){
        return 1;
    }
    // static修饰的不包括
    static void update() {}
}

6. JDK1.8中定义的Lambda表达式

  • Supplier<T>: 代表一个输出
@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}
  • Consumer<T>: 代表一个输入
@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}
  • BiConsumer<T, U>: 代表2个输入.
@FunctionalInterface
public interface BiConsumer<T, U> {

    /**
     * Performs this operation on the given arguments.
     *
     * @param t the first input argument
     * @param u the second input argument
     */
    void accept(T t, U u);
}
  • Function<T, R>: 代表一个输入, 一个输出(一般输入和输出是不同类型的)
@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);
}
  • UnaryOperator<T>: 代表一个输入, 一个输出(输入和输出是相同类型)
@FunctionalInterface
public interface UnaryOperator<T> extends Function<T, T> {
}
  • BiFunction<T, U, R>: 代表2个输入, 一个输出.(一般输入输出不同)
@FunctionalInterface
public interface BiFunction<T, U, R> {

    /**
     * Applies this function to the given arguments.
     *
     * @param t the first function argument
     * @param u the second function argument
     * @return the function result
     */
    R apply(T t, U u);

  • BinaryOperator: 代表2个输入, 一个输出 (输入和输出是相同类型的)
@FunctionalInterface
public interface BinaryOperator<T> extends BiFunction<T,T,T> {
}

二、Lambda表达式详解

1. Lambda表达式

  1. Lambda表达式是对象, 是一个函数式接口的实例.

2. Lambda表达式语法

  • 语法: LambdaParameters -> lambdaBody
    例子
    Runnable r = () -> Systerm.out.print("例子");
  • 自己理解如下:
    函数式接口定义的方法中的参数是LambdaParameters, 加上->, 实现函数式接口的具体内容是lambdaBody.

三、方法的引用(一)

方法的引用: 用来直接访问类或者实例的已经存在的方法或构造方法, 方法引用提供了一种引用而不执行方法的方式, 如果抽象方法的实现恰好可以使用调用另外一个方法来实现, 就有可能使用方法引用.

方法引用分类

类型 语法 对应的lambda表达式
静态方法引用 类名::staticMethod (args)->类名.staticMethod(args)
实例方法引用 inst::instMethod (args)->inst.instMethod(args)
对象方法引用 类名::instMethod (args)->类名.instMethod(args)
构造方法引用 类名::new (args)->new 类名(args)

静态方法引用

定义: 如果函数式接口的实现恰好是通过调用一个静态方法来实现, 那么就可以使用静态方法使用.

实例方法引用

定义: 如果函数式接口的实现恰好可以通过调用一个实例的实例方法来实现, 那么就可以使用实例方法引用

语法: inst::instMethod

对象方法引用

定义: 函数是接口中的抽象方法的第一个参数类型刚好是实例的类型, 抽象方法剩余的参数恰好可以当做实例方法的参数. 如果函数式接口的实现能由上面说的实例方法调用来实现的话, 那么就可以使用对象方法引用.

  • 抽象方法的参数类型. 而不是抽象接口.例如:
  • 对象方法引用适用于自定义对象.
   /**
     * 注意不要用函数式接口的泛型参数来对比参数:
     * 比如函数式接口: BiFunction<DemoLamda5, String, String>
     *  要对比它的抽象方法: R apply(T t, U u);
     *  第一个参数T, 要是实例的类型DemoLamda5
     *  第二个参数U, 要是实例方法getA(String b)的参数b类型一致
     *  R是出参, 不是抽象方法的入参.
     */
public class DemoLamda5 {

    public String getA(String b) {
        return b;
    }

    public void test1() {

        BiFunction<DemoLamda5, String, String> biFunction = (a, b) -> new DemoLamda5().getA(b);
        BiFunction<DemoLamda5, String, String> biFunctio2n = DemoLamda5::getA;
    }
}


构造方法引用

定义: 如果函数式接口的实现恰好可以通过调用一个类的构造方法来实现, 那么就可以使用构造方法引用.

  • 注意: 构造方法引用适用于无参的构造方法. 有参也可以使用.
public class DemoLambda6 {

    public void testConst() {
        // 全写
        Supplier<Person> supplier = () -> {
            return new Person();
        };

        // 构造方法引用写法
        Supplier<Person> supplier1 = Person::new;
    }
}

五、Stream API

英文定义: A sequence of elements supporting sequential and parallel aggregate operations
Stream是一组用来处理数组、集合的API

特性

  • 不是数据结构, 没有内部存储
  • 不支持索引访问
  • 延迟计算
  • 支持并行
  • 很容易生成数组或集合(List, Set)
  • 支持过滤, 查找, 转换, 汇总, 聚合等操作.

Stream运行机制

  • Stream分为源source, 中间操作, 终止操作。
  • 流的源可以是一个数组、 一个集合、 一个生成器方法、 一个I/O通道等等.
  • 一个流可以有零个或多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用,一个流只会有一个终止操作。
  • Stream只有遇到终止操作,它的源才开始执行遍历操作。

Stream的创建

  1. 通过数组
  2. 通过集合
  3. 通过Stream.generate方法来创建
  4. 通过Stream.iterate方法来创建
  5. 其他API创建.

Stream常用API

中间操作

  • 过滤 filter
  • 去重 distinct
  • 排队 sorted
  • 截取 limit, skip
  • 转换 map/flatmap
  • 其他 peek

终止操作

  • 循环 foreach
  • 计算 min, max, count, average
  • 匹配 anyMatch, allMatch, noneMatch, findFirst, findAny
  • 汇聚 reduce
  • 收集器 toArray, collect

七、 Lambda表达式、方法的引用、Stream API实战

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,635评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,628评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,971评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,986评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,006评论 6 394
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,784评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,475评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,364评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,860评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,008评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,152评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,829评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,490评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,035评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,156评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,428评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,127评论 2 356

推荐阅读更多精彩内容