Java 8新特性 Lambde表达式介绍-使用

来源:互联网 发布:网络机顶盒怎么看直播 编辑:程序博客网 时间:2024/05/21 13:58

Lambde表达式干什么用的?
  一种简写的格式, 类似于for循环和增强for循环关系,最直观的好处简写代码,以前要占四五行代码,现在可能只需要用一行代码就搞定了

        ArrayList<String> list = new ArrayList<>();        //普通for 循环        for (int index = 0; index < list.size(); index++) {            ......        }        //增强for 循环        for (String string : list) {            ......        }

下面是示例代码 和详细解析

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //示例代码1:重写的方法不带参数        new Thread(new Runnable() {            @Override            public void run() {                Log.i(TAG, "run: ");            }        });        new Thread(() -> Log.i(TAG, "onCreate: "));        new Thread(() -> {Log.i(TAG, "onCreate: ");});        //示例代码2:重写的方法带一个参数        Button button = new Button(this);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Log.i(TAG, "onClick: ");            }        });        button.setOnClickListener(v -> Log.i(TAG, "onCreate: "));        button.setOnClickListener((v) -> {Log.i(TAG, "onCreate: ");});        button.setOnClickListener((View v) -> {Log.i(TAG, "onCreate: ");});        //示例代码三:重写的方法带多个参数,并带有返回值        File file = new File("");        file.list(new FilenameFilter() {            @Override            public boolean accept(File dir, String filename) {                return filename.endsWith(".png");            }        });        file.list((dir, filename) -> filename.endsWith(".png"));        file.list((File dir, String filename) -> {return filename.endsWith(".png");});        file.list((File dir, String filename) -> {            Log.i(TAG, "onCreate: ");            return filename.endsWith(".png");        });    }

Lambde表达式分两部内容: “->”的左侧和右侧

如下图:
这里写图片描述

“->”左边表达式,相当于重写方法里面的参数,有三种情况:

  • 重写的方法没有参数时,用()表示;上面的实例代码1
  • 有一个参数时,表示方式有下面三种:上面的实例代码2
    • v :变量名;可以是任意自定义的,当然最好和类型、具体参数意义相关
    • (v):括号包裹变量名;
    • (View v):括号里面数据类型加上变量名
  • 重写的方法里面有多个参数,表示方式:上面的实例代码3
    • (dir, filename):括号包裹变量名,变量名可任意自定义,各个变量之间有逗号隔开
    • (File dir, String filename):在上面的基础上给变量加上数据类型

“->”右边表达式,相当于自己重写方法里面的具体内容,有两种情况:

  • 重写的方法表达式只有一句话时,分两种情况:
    • 返回值为void:示例代码1
      • Log.i(TAG, “onCreate: “):直接写上这句话,并省略分号;
      • {Log.i(TAG, “onCreate: “);}:用大括号包裹,并且有语句结束符号分号
    • 返回值为非void:示例代码3
      • filename.endsWith(“.png”):直接写上这句话,并省略分号;
      • {return filename.endsWith(“.png”);}:用大括号包裹,并且有语句结束符号分号,语句前面必须加上return关键字;
  • 重写的方法表示式有多句话时:示例代码3
    • {Log.i(TAG, “onCreate: “);return filename.endsWith(“.png”);}:大括号包裹多条语句,每句话都必须有结束符号分号;如果返回值类型为非void,必须有return结束语句;如果返回值为void,可以省略return 语句;

PS: Lambde表达式只支持重写一个方法的, 如果你重写的方法有多个, 不好意思, 不支持

问题来了,既然这么多表示方式,到底用那种呢?

  快捷键提示就知道了, 应该是最简洁的: 如果左侧只有一个参数, 那么就可以省略小括号和参数类型; 如果右侧只有一句话, 就可以省略大括号和分号
  
Android Studio提示快捷键: 快捷键Ctrl + Shift + 空格
这里写图片描述

在Android Studio上面用法:
问题是Android Studio 2.1版本以前不支持Lambde表达式,解决办法:传送门 gradle-retrolambda

0 0