泛型:
在使用Collection收集对象时,由于事先不知道被收集对象的形态,因此内部操作时都是使用 Object来参考被收集的对象,取回对象时也是以 Object类型返回。由于取回对象时会以 object类型返回,若想针对某类定义的行为操作时,必须告诉编译程序,让对象重新扮演该类型。例如
List names = Arrays. aslist("Justin","Monica","Irene");
String name =(String) words. get(0)
Collection收集对象时,考虑到收集各种对象的需求,因而内部操作采用 Object参考收集的对象,所以执行时期被收集的对象会失去形态信息,也因此取回对象之后,必须自行记得对象的真正类型,并在语法上告诉编译程让对象重新扮演为自己的类型。Collection虽然可以收集各种对象,但实际上通常 Collection中会收集同一种类型的对象。因此从JDK5之后,新增了泛型( Generics)语法,让你在设计API时可以指定类或方法支持泛型,而使用API的客户端在语法上会更为简洁,并得到编译时期检查。类名旁出现角括号表示支持泛型语法
public interface Comparator<T>{
int compare(T o1,T o2);//接口使用泛型
}
操作泛型接口:
public class SC implements Comparator<String>{
@Override
public int compare(String s1,String s2){
return -s1.compareTo(s2);
}
}
如果不用泛型:
public class SC implements Comparator<String>{
@Override
public int compare(String s1,String s2){
String s1=(String)o1;
String s2=(String)o2;
return -s1.compareTo(s2);
}
}
只要声明参数时有指定类型,创建对象时就不用再写类型。
方法设计成泛型:
public static <T> T some(T[] t,int i){
return T[i];
}
.......
String a=some(args,i);//调用方法
Lambda:
匿名类语法:
Request request =new Request() {
@Override
public void execute() {
System.out.println("ggggggg.....");
}
};
声明 request变量时已经告知是 Request类型,而建立 Request实例的匿名类语法又写了一次,实际上 Request接口只有一个方法必须实现,当这种情况发生时,在JDK8中使用 Lambda表达式( Expression)如下撰写:
Request request=()->out. println("gggggg");
相对于匿名类语法来说, Lambda:表达式的语法省略了接口类型与方法名称,→左边是参数列,而右边是方法本体,编译程序可以由 Request request的声明中得知语法上被省略的信息。
如果要返回值:
interface Request {
int execute(int i);
}
......//lambda语法
Request request=(i)->i*2;
泛型+lambda:
interface Request <T>{
int execute(T s1,T s2);
}
......//lambda语法
Request<String> request=(name1,name2)->name1.length()-name2.length();