泛型、Lambda简介

泛型:
在使用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();

猜你喜欢

转载自blog.csdn.net/zkd758/article/details/80037368