MENU

Java 8学习笔记(一)Hello Lambda

March 3, 2018 • Read: 173 • 无码

在Android、Swing中,会经常看到类似代码;将行为包装成一个对象(匿名内部类)进行传递。为了传递一行逻辑代码,需要额外样板代码,而且可读性较差。

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        Toast.makeText(MainActivity.this, "you have clicked Button", Toast.LENGTH_SHORT).show();
    }
});

在Java 8中引入了lambda表达式,Lambda可以简单理解为一个代码块,我们可以直接把Lambda作为参数传给方法;在上述代码中,我们可以直接传递行为代码,而不需要构造一个匿名内部类:

button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "you have clicked Button", Toast.LENGTH_SHORT).show());

v是参数名,等价于匿名内部类中的v,->后面则等价于匿名内部类方法体。

lambda表达式形式:

  1. Runnable只有run 方法,没有参数,转换后用括号 () 表示没有参数;表达式主体是代码块,需要大括号{};

    Runnable runnable = () -> {
        System.out.println("hello!");
        System.out.println("run!");
    };
  2. 一个参数可以省略参数括号,表达式主体只有一行,可以省略大括号;

    button.setOnClickListener(v -> Toast.makeText(MainActivity.this, "you have clicked Button", Toast.LENGTH_SHORT).show());
  3. Lambda表达式包含多个参数时,需要使用括号;

    BinaryOperator<Long> add = (x, y) -> x + y;    
  4. Lambda 表达式的类型依赖于上下文环境,是由编译器 推断出来的;但有时最好也可以显式声明参数类型;

    BinaryOperator<Long> add = (Long x, Long y) -> x + y;
Tags: Lambda
Archives QR Code
QR Code for this page
Tipping QR Code