Ø 基础讲解
Lambda表达式是一种基于函数的编程语言,下面我们来演示一下java8中lambda表达式的运用,根据例子来分析一下java8中lambda表达式的改进。
新建一个项目,这个项目必须是基于java8的,我使用的IDE编辑器是idea,故而配置idea的jdk环境为java8,配置如图:
我们先来看一下传统的写法:
第一种实现方式
interface Message{
public void print(String str);
}
public class TestDemo {
public static void main( String[] args ) {
/**
* 使用的是匿名内部类的方式
*/
Message msg = new Message() {
@Override
public void print( String str ) {
System.out.println(str);
}
};
msg.print("hello world!");
}
}
我们用lambda表达式再来进行书写呢?
interface Message{
public void print(String str);
}
//定义一个统一的接口
public class TestDemo {
public static void main( String[] args ) {
/**
* 使用lambda表达式的方式
*/
Message msg=(s)-> System.out.println(s);
msg.print("hello world!");
}
}
我们会发现代码明显减少了好多,那么这些代码怎么理解呢?
详解一下吧:
(s)->System.out.println(s)
(语法结构:参数,名称随意->方法体)
S-------是一个参数,这个参数名称是可以随意起的,但是有一定的要求,那就是必须与接口Message定义的print方法的参数类型一致,但是此处是可以进行声明也可以不声明,追求完美度高的用户可以进行声明。
写法: Message msg=(String s)-> System.out.println(s); lambda表达式
->: 是一个固定的写法,表示的方法指向方法体
方法体:就是在进行早期匿名内部类实现方法的时候所编写的方法体代码。
在使用lambda表达式的时候有一个最为重要的定义要求,那就是接口里面的方法只能存在一个。使用lambda表达式为了直接能够找到对应的方法,只能是定义一个。
特别需要注意的是:
1、 lambda表达式最重要的目的是解决匿名内部类的问题;
2、 想要使用lambda表达式,那么必须以接口为主,而且接口里面只能够定义一个抽象方法。
Ø 示例说明
比如我们以实现runnable()接口为例来进行说明
import java.text.MessageFormat;
/**
* Created by xiaona on 2016/5/29.
*/
public class TestRunnable {
public static void main( String[] args ) {
new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类实现Runnable方法");
}
}.run();
/**
* 使用lambda表达式进行实现
*/
int i=1;
Runnable r=()->{
System.out.println("用lambda实现Runnable方法");
System.out.println(MessageFormat.format("i={0}", i));
};
r.run();
}
}
除了像这样接口似得实现,我们也可以自己定义一个匿名内部类实现登录操作,同样是可以进行实现的
public class TestAction {
public static void main( String[] args ) {
new Action(){
@Override
public void execute( String content ){
System.out.println(content);
}
}.execute("java8之前实现的登录的操作");
Action login=(content)-> {System.out.println(content);};
login.execute("java8实现的登录操作");
}
static interface Action{
void execute(String content);
}
}
细心的我们会发现,使用lambda表达式与匿名类的不同在于不仅仅是代码变得简洁了,还有就是匿名类编译完毕的class文件是有$符号,而使用lambda表达式是没有的。