您的位置:首页 > 编程语言 > Java开发

Java 8 Lambda表达式

2016-07-08 00:00 501 查看
#Lambda表达式

##1.Lambda表达式
Lambda表达式是一段可以传递的代码,因此他可以执行一次或者多次。

String array[]={"Harry",
"Potter",
"Jack",
"Tom"};
List<String> list=Arrays.asList(array);
//使用lambda遍历
list.forEach((String) -> System.out.print(String+";"));
//使用匿名类
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("this is NimingThread!");
}
}).start();;
//将匿名类转换为lambda表达式
new Thread(()->System.out.println("this is lambda")).start();

输出为:Harry;Potter;Jack;Tom;
this is NimingThread!
this is lambda
##2.函数式接口
对于只包含一个抽象方法的接口,可以通过lamba表达式来创建接口的对象,这种接口被称为函数式接口。

//使用lambda对数组排序
//方式一
Arrays.sort(array, (String s1, String s2) -> (s1.compareTo(s2)));
//方式二
Comparator<String> sort = (String s1, String s2) -> (s1.compareTo(s2));
Arrays.sort(array, sort);

##3.方法引用
有些时候,想要传递给其他代码的操作已经有实现的方法了。如按钮点击打印对象,如下

//方式一

button.setAction(event->System.out.println(event));

//方式二:
button.setOnAction(System.out::println);

::操作符讲方法名和对象或类的名字分隔开来。如下三种情况:

对象::实例方法

类::静态方法

类::实例方法

还可以捕获方法引用中的super对象

static class Test{
public void test(){
System.out.println("test!!");
}
}
static class TestImpl extends Test{

@Override
public void test() {
new Thread(()->super.test()).start();
}
}

输出为:test!!
##4.构造器引用
构造器引用同方法引用类似,不同的是构造器引用中方法名是new。
例如Test::new 表达Test类的构造器引用。
##5.变量作用域
通常,我们希望能在lambda表达式的闭合方法或其他类中访问其他的变量

static void sendMessage(String word,int count){
new Thread(()->{for(int i=0;i<count;i++){
System.out.print(word+"; ");
}}).start();
}
//main程序调用
sendMessage("hello world", 5);

输出为:hello world; hello world; hello world; hello world; hello world;
在lambda表达式中并没有定义word,count,使用的是sendMessage的参数变量。原因为一个lambda包含三个部分

一段代码

参数

自由变量的值,“自由”指的是不是参数,并且没有被定义的变量。

所以,此例中lambda有两个自由变量,word和count。
notes:含有自由变量的代码块称为闭包。
##6.默认方法
Java通过默认方法允许接口包含带有具体实现的方法。

public interface Animal {
public void sleep();
default public void run(){
System.out.println("I am Running");
};
}

如果一个接口中定义了一个默认方法,而另外一个父类或接口又定义了一个同名的方法,解决方法遵循如下规则:

选择父类中的方法。如果一个父类提供了具体的实现,那么接口中具体相同名称和参数的默认方法就会被忽略。

接口冲突。如果一个父接口提供了一个默认方法,而另一个接口特提供了一个具有相同名称和参数的默认方法,那么必须通过在具体类里覆盖方法来解决冲突。

public class Animal {
public void run(){
System.out.println("Animal is running");
}
}

public interface Activity {
public void sleep();
default public void run(){
System.out.println("Activity is Running");
};
}
public class Tiger extends Animal implements Activity{

@Override
public void sleep() {
// TODO Auto-generated method stub
System.out.println("Tiger is Sleeping");
}
//发生冲突时,重写run方法。
//	@Override
//	public void run(){
//		System.out.println("Tiger is running");
//	}
}


输出为:Animal is running
##7.接口中的静态方法
在Java 8中可以为接口添加静态方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: