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

2018-01-30  本文已影响0人  黄烨1121

本章目录


什么是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表达式

上一篇 下一篇

猜你喜欢

热点阅读