美文网首页
Java8 新特性(二)- Labmda表达式

Java8 新特性(二)- Labmda表达式

作者: 黄烨1121 | 来源:发表于2018-01-30 17:01 被阅读0次

本章目录

  • Part One:Labmda表达式语法
  • Part Two:Lambda表达式结构详解
  • Part Three:Functional Interface

什么是Lambda表达式?先从我们最熟悉的按钮点击事件来看起,原先的写法是这样的:


按钮点击事件.png

注意到左边红框圈住的部分,点击收缩即可借助Android Studio自带的扩展功能转换为Lambda表达式形式:


按钮点击Lambda形式.png

Part One:Labmda表达式语法

从上图的例子可以看到,Lambda表达式将6行代码简化为1行代码。这样可以极大的减少代码冗余,同时可读性也好过冗长的内部类,匿名类。
其语法形式为:

//省略参数类型
(arg1, arg2, ...) -> {body}
//指定参数类型
(Type1 arg1, Type2 arg2, ...) -> {body}

lambda表达式中,参数的类型可省略。Java编译器根据表达式的上下文推导出参数的类型。

Part Two:Lambda表达式结构详解

  1. 参数可以是零个或多个
package cn.tmooc.tarena;

interface OneArgument{
    void onClick(int x);
}

interface TwoArgument{
    void onClick(int x, int y);
}

public class LambdaSimpleSample {
    public static void main(String[] args) {
        //零个参数
        Runnable runnable = () -> System.out.println("零个参数");
        //1个参数
        OneArgument oneArgument = (x) -> System.out.println(x + 1);
        //2个参数
        TwoArgument twoArgument = (x, y) -> System.out.println(x + y);
    }
}
  1. 参数类型可指定,可省略
package cn.tmooc.tarena;

interface OneArgument{
    void onClick(int x);
}

public class LambdaSimpleSample {
    public static void main(String[] args) {
        //省略参数类型
        OneArgument oneArgument1 = (y) -> System.out.println(y + 1);
        //指定参数类型
        OneArgument oneArgument2 = (int y) -> System.out.println(y + 1);
    }
}
  1. 参数包含在圆括号中,用逗号分隔,参考2.1里面的2个参数的例子
  2. 表达式主体可以是零条或多条语句,包含在花括号中
package cn.tmooc.tarena;

interface OneArgument{
    void onClick(int x);
}

public class LambdaSimpleSample {
    public static void main(String[] args) {
        //body是0条语句
        OneArgument oneArgument1 = (y) -> {};
        //body是多条语句
        OneArgument oneArgument2 = (y) -> {
            System.out.println(y + 1);
            System.out.println(y + 2);
        };
    }
}
  1. 表达式主体只有一条语句时,花括号可省略,参考2.1的案例。个人感觉最好不要省略,养成一个习惯
  2. 表达式主体有一条以上语句时,表达式的返回类型与代码块的返回类型要匹配上
package cn.tmooc.tarena;

interface VoidInterface{
    void onClick(int x);
}

interface IntInterface{
    int onClick(int x);
}

public class LambdaSimpleSample {
    public static void main(String[] args) {
        //无返回值时
        VoidInterface voidInterface = (y) -> {
            System.out.println(y + 1);
            y = y + 2;
        };
        //有返回值时,必须加return语句
        IntInterface intInterface = (y) -> {
            System.out.println(y + 1);
            return y = y + 2;
        };
    }
}

Part Three:Functional Interface

在Part Two里面定义的接口,一直是这种形式的:

interface OneArgument{
    void onClick(int x);
}

其中,该接口中只有一个方法。在Java 8中,这种接口称之为Functional Interface(函数式接口)。
以前我们都是习惯使用匿名内部类实现该接口,现在也用作Lambda表达式的类型。
常见的Functional Interface有Runnable,OnClickListener和Comparator。另外,Java 8也新增了很多函数式接口:

接口 参数 返回值 用途
Predicate T boolean 断言
Consumer T void 消费
Function T R 函数
Supplier None T 工厂方法
UnaryOperator T T 逻辑非
BinaryOperator (T,T) T 二元操作

具体这些接口的用途等学完stream和方法引用另开单章细说。


参考资料:30分钟入门Java8之lambda表达式

相关文章

  • Java8 新特性(二)- Labmda表达式

    本章目录 Part One:Labmda表达式语法 Part Two:Lambda表达式结构详解 Part Thr...

  • Java 8、9 语言新特性

    Java语言新特性 Java8 Java 8 新特性 Lambda 表达式 Lambda表达式(也叫做闭包)是Ja...

  • java8

    现代化 Java - Java8 指南 JAVA8新特性(吐血整理) 理解 Lambda 表达式

  • Java8常用的新特性总结

    一、Java8常用的新特性总结 1.1.Java8常用特性总览 1.2.lambda表达式 在Java8中引入了一...

  • java8 新特性

    java8 新特性 1 Lambda表达式 lambda 是一个匿名函数, lambda 表达式基本语法: jav...

  • Lambda表达式

    内容整理自bilibili 参考链接 一、lambda表达式的简介 lambda表达式是java8添加的新特性; ...

  • Java8 新增了非常多的特性

    新特性Java8 新增了非常多的特性,我们主要讨论以下几个: Lambda 表达式 − Lambda允许把函数作为...

  • Lambda 表达式

    Lambda 表达式 声明:java8新特性系列为个人学习笔记,参考地址点击这里,侵删!! Lambda 表达式,...

  • Lambda表达式和函数式接口

    初识lambda表达式 lambda表达式是Java8的新特性,可以将lambda表达式看成是精简语法的匿名内部类...

  • Java8 新特性之 Lambda 表达式

    Lambda表达式 lambda表达式是java8给我们带来的几个重量级新特性之一,借用lambda表达式,可以让...

网友评论

      本文标题:Java8 新特性(二)- Labmda表达式

      本文链接:https://www.haomeiwen.com/subject/nzpuaxtx.html