拖着生病的身体,终于面试结束,趁着没有遗忘,先整理下
自己使用Eclipse一边写,一边感受下好了,面试时候,主要强调的是Lambda表达式,先来看看。
1. Lambda表达式
package temp;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class Java8 {
public static void main(String[] args) {
List<String> name = Arrays.asList("xiekai","xiaowang","xiaoxia");
Collections.sort(name, new Comparator<String>() {
public int compare(String a, String b) {
return b.compareTo(a);
}
});
}
}
在Collections.sort里面传入一个比较器来指定排序,创建一个匿名对象,传入sort里面。
但是java8里面,使用Lambda表达式,更简洁的。
//Lambda表达式
Collections.sort(name, (String a, String b)->{
return a.compareTo(b);
});
System.out.println(name);
Collections.sort(name, (String a, String b)->a.compareTo(b));
System.out.println(name);
Collections.sort(name, (a,b)->a.compareTo(b));
System.out.println(name);
呀呀呀,好简洁。。。。
特别是最后一个,Java编译器可以自动推导出参数类型,所以你可以不用再写一次类型。
继续看Lambda表达式。
2. 函数式接口
Lambda表达式是如何在java的类型系统中表示的呢?每一个lambda表达式都对应一个类型,通常是接口类型。而“函数式接口”是指仅仅只包含一个抽象方法的接口,每一个该类型的lambda表达式都会被匹配到这个抽象方法。因为 默认方法 不算抽象方法,所以你也可以给你的函数式接口添加默认方法。
我们可以将lambda表达式当作任意只包含一个抽象方法的接口类型,确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
@FunctionalInterface
interface Converter<F, T> {
T convert(F from);
}
Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted); // 123
需要注意如果@FunctionalInterface如果没有指定,上面的代码也是对的。
译者注 将lambda表达式映射到一个单方法的接口上,这种做法在Java 8之前就有别的语言实现,比如Rhino JavaScript解释器,如果一个函数参数接收一个单方法的接口而你传递的是一个function,Rhino 解释器会自动做一个单接口的实例到function的适配器,典型的应用场景有 org.w3c.dom.events.EventTarget 的addEventListener 第二个参数 EventListener。
上述转自 http://www.jb51.net/article/48304.htm
3. 方法与构造函数的引用