美文网首页
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表达式

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