Java8:Lambda表达式

一、相比Java7,Java8的新特性
接口的默认方法
Java 8 允许给接口添加一个非抽象的方法实现,只需要使用default关键字即可,这个特征又叫做扩展方法。


Lambda表达式


函数式接口


方法与构造函数引用


Java类库的新特性
Java 8 通过增加大量新类,扩展已有类的功能的方式来改善对并发编程、函数式编程、日期/时间相关操作以及其他更多方面的支持。

二、Lambda表达式
       lambda是十分常见的编程语言结构,在函数式编程语言(例如Lisp、Haskell)中使用范围极广。

1.lambda表达式的定义
      lambda表达式其实就是没有名称的函数,在Java中可以把它当成一个值。Java不允许脱离类的概念运行方法,所以lambda表达式是在某个类中定义的匿名方法(开发者可能不知道具体是哪个类)。

2.lambda表达式语法

通常以(argument) -> {body}这样的格式书写,argument是参数,body是表达式主体,其中参数类型可以指定,也可以省略,省略的话,编译器可以自己推断出来类型。

(arg1,arg2...) -> {body}             //省略参数类型
(Type1 arg1,Type2 arg2...)->{body}   //指定参数类型
参数可以是零个或多个,多个时在括号中,用逗号分隔

() -> {body}  //零个参数时,用一个空的圆括号表示参数
(arg1) -> {body}  或者  arg1→{body}    //一个参数
(arg1,arg2) -> {body}  //多个参数


body表达式主体可以是零条或多条语句,包含在花括号中,body表达式主体只有一条语句时,花括号可以省略

三、函数式接口(FunctionalInterface)
       函数式接口是Java 8为支持Lambda表达式新发明的。lambda表达式依托于函数接口。

       它的定义:一个接口,如果只有一个显式声明的抽象方法,那么它就是一个函数接口。一般用@FunctionalInterface标注出来(也可以不标)。

@FunctionalInterface
public interface Lambda4Function {

public int add(int x ,int y);

}

四、Lambda4Function接口的使用


public class Lambda4FunctionInterfaceTest {

public static void main(String[] args){

//new一个匿名类对象
Lambda4Function lf1 = new Lambda4Function(){
public int add(int x,int y ){
return  x+y;
}
};
int sum1 = lf1.add(3,4);
System.out.println("旧方式求3+4="+sum1);

//lambda表达式方式,指定参数类型
Lambda4Function lf2 = (int x,int y)->{return x+y;};
int sum2 = lf2.add(5,6);
System.out.println("lambda方式,指定参数类型,求5+6="+sum2);

//lambda表达式方式,不指定参数类型
Lambda4Function lf3 = (x, y)->{return x+y;};
int sum3 = lf3.add(7,8);
System.out.println("lambda方式,不指定参数类型,求7+8="+sum3);


}
}
五、Runnable和Comparator接口的使用
1.Runnale接口,,新建线程

public class Lambda4Runnable {

public static void main(String[] args){

Runnable oldRunnable = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": Old Runnable");
}
};

Runnable newRunnable = () -> {
System.out.println(Thread.currentThread().getName() + ": New Lambda Runnable");
};

new Thread(oldRunnable).start();
new Thread(newRunnable).start();
}
}


2.Comparator接口,String数组排序

public class LambdaStudy {

public static void main(String[] args){

String[] oldWay = "Improving code with Lambda expressions in Java 8".split(" ");

//旧方式实现
Arrays.sort(oldWay, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.toLowerCase().compareTo(s2.toLowerCase());
}
});
System.out.println(String.join(",",oldWay));

//lambda表达式实现
String[] newWay =  "Improving code with Lambda expressions in Java 8".split(" ");
Arrays.sort(newWay,(s1, s2) -> {
return s1.toLowerCase().compareTo(s2.toLowerCase());
});
System.out.println(String.join(",",newWay));

}
}
六、lambda表达式与集合类
public class Lambda4List {
public static void main(String[] args){

List<String> ls = new ArrayList<String>();
ls.add("到餐");
ls.add("外卖");
ls.add("猫眼");

//旧的方式遍历
for(String st: ls){
System.out.println(st);
}

System.out.println("---------分隔符---------");

//lambda方式
ls.forEach(s -> {System.out.println(s);});

}
}
 

猜你喜欢

转载自my.oschina.net/u/3705388/blog/1826339