Quantcast
Channel: CSDN博客移动开发推荐文章
Viewing all articles
Browse latest Browse all 5930

lambda表达式介绍以及Android Studio引入lambda

$
0
0

一、简介

“Lambda 表达式”(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包。

运算符将表达式分为两部分,左边指定输入参数,右边是lambda的主体。
        lambda表达式:
               1.一个参数:param=>expr
               2.多个参数:(param-list)=>expr

二、JAVA中Lambda表达式的使用

Java 8比较吸引人的新特性需要有两个lambda表达式和流API

lambda表达式实现Runnable

//Java 8之前
new Thread(new Runnable() {
@Override
public void run() {
	System.out.println("Before Java8, too much code for too little to do");
}
}).start(); 

//Java 8方式
new Thread( () -> System.out.println("In Java8, Lambda expression rocks !!") ).start();

lambda表达式进行事件处理

// Java 8之前
JButton show =  new JButton("Show");
show.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
    System.out.println("Event handling without lambda expression is boring");
    }
});

// Java 8方式
show.addActionListener((e) -> {
    System.out.println("Light, Camera, Action !! Lambda expressions Rocks");
});


使用lambda表达式对列表进行迭代
// Java 8之前
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
for (String feature : features) {
    System.out.println(feature);
}
	
// Java 8方式
List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API");
features.forEach(n -> System.out.println(n));
// 使用Java 8的方法引用更方便,方法引用由::双冒号操作符标示,
features.forEach(System.out::println);

三、lambda表达式与匿名类的区别

一个关键的不同点就是关键字 this。匿名类的 this 关键字指向匿名类,而lambda表达式的 this 关键字指向包围lambda表达式的类。另一个不同点是二者的编译方式。Java编译器将lambda表达式编译成类的私有方法。使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。

四、Android Studio中使用lambda

有两种方式

第一种方式是原生支持在app的build.gradle中配置

android {
defaultConfig {
        jackOptions {
            enabled true
        }
    }
   compileOptions {
       sourceCompatibility JavaVersion.VERSION_1_8
       targetCompatibility JavaVersion.VERSION_1_8
   }
}

第二种方法是通过第三方库支持

buildscript {
  repositories {
     mavenCentral()
  }

  dependencies {
     classpath 'me.tatarka:gradle-retrolambda:3.2.3'
  }
}

// Required because retrolambda is on maven central
repositories {
  mavenCentral()
}

apply plugin: 'com.android.application' //or apply plugin: 'java'
apply plugin: 'me.tatarka.retrolambda'


欢迎扫描二维码,关注公众号


作者:robertcpp 发表于2017/1/11 10:52:15 原文链接
阅读:1517 评论:0 查看评论

Viewing all articles
Browse latest Browse all 5930

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>