匿名类:匿名类的特征在于不必另外编写一个类用于实例化,而是在实例化一个类的时候就对该类的方法和特征进行编写,因此匿名类的生命周期在其被实例化之后便会释放,因此匿名类具有如下特征:立即实例化对象后该对象的匿名类立即消失;不可抽象;没有构造器;定义的时候不需要定义class的关键字;匿名类在创建时即被实例化因此没有类名,从而无法被系统获取其类型。以上特征表现匿名类适用于只使用一次的类。声明匿名类时一般都在其他实类的内部,因此也称匿名内部类,创建实例时对继承的类或者接口需要进行重构或覆写。
形式:
public class TestAnonymousInterClass{
public static void main(String args[]){
TestAnonymousInterClass test=new TestAnonymousInterClass();
test.show();
}
//在这个方法中构造了一个匿名内部类
private void show(){
Out anonyInter=new Out(){// 获取匿名内部类实例
void show(){//重写父类的方法
System.out.println("this is Anonymous InterClass showing.");
}
};
anonyInter.show();// 调用其方法
}
}
// 这是一个已经存在的类,匿名内部类通过重写其方法,将会获得另外的实现
class Out{
void show(){
System.out.println("this is Out showing.");
}
}
lambda表达式:lambda表达式是jdk8为了简化代码复杂度而提出一种新的编写方法,个人认为实际上就是对匿名内部类的编写的简化版方式,因此一般形式为
实例名=(入参数,可为空)->{ 类的方法和表达式;入参如果是类实例可以调用实例的方法}
reduce函数: jdk提供的一个迭代函数,格式为reduce(func,par1,....,parn),其中国func是传入的一个有返回值的功能函数,par为传入的多个参数,可以不限量,reduce的功能为将参数依次输入功能函数func中,执行完后将func的返回值和接下来没有被输入func的参数一起再次输入func中,直到所有的par都被输入过func中一次,最后一次得到的func的返回值即为reduce的返回值
BiFunction: BiFunction形式继承于Function接口,java8中以接口形式定义在依赖中,其函数形式为BiFunction(param1,param2,param3),其中param都为参数的类型(不一定是基本类型),param1和2都是入参的类型,param3为BiFunction的返回值的类型。BiFunction的源码格式如下:
@FunctionalInterface
public interface BiFunction<T, U, R> {
/**
* Applies this function to the given arguments.
*
* @param t the first function argument
* @param u the second function argument
* @return the function result
*/
R apply(T t, U u);
因此,在继承BiFunction接口时,会对apply函数的内容进行覆写,示例如下:
private static void java7_biFunction() {
BiFunction<String, String, String> bi = new BiFunction<String, String, String>(){
@Override
public String apply(String t, String u) {
return t+u;
}
};
Function<String, String> func = new Function<String, String>() {
@Override
public String apply(String t) {
return t+"-then";
}
};
System.out.println(func.apply("test"));//test-then
System.out.println(bi.apply("java2s.com", "-tutorial"));//java2s.com-tutorial
System.out.println(bi.andThen(func).andThen(func).apply("java2s.com", "-tutorial"));//java2s.com-tutorial-then-then
}
上述实例中,实现接口BiFunction利用的匿名内部类的方式(当然也可以用实例类的方式不过占空间),并对apply函数进行了具体实现,因此,在调用BiFunction实例bi的时候,仅需要传入头两个类型的参数即可使用,如println的第二行。
其中,andThen函数时BiFunction接口继承的Function接口的功能函数,其意义是返回一个Function供后续函数进行嵌套调用。以上述最后一句println打印为例,系统先执行bi.apply的入参方法,再将结果供给第一个andThen函数执行func.apply方法,再将返回结果供给第二个andThen执行其func.apply方法。 Function接口中还有一个compose方法与之类似,不过执行顺序有所不同,暂表不提既然使用了匿名内部类,自然BiFunction也可以用lambda表达式进行实现,示例如下:
private static void java8_biFunction() {
//java8新特性,lambda表达式
BiFunction<String, String,String> bi = (x, y) -> {
return x + y;
};
Function<String,String> func = x-> x+"-then";
System.out.println(func.apply("test"));//test-then
System.out.println(bi.apply("java2s.com", "-tutorial"));//java2s.com tutorial
System.out.println(bi.andThen(func).andThen(func).apply("java2s.com", "-tutorial"));//java2s.com-tutorial-then-then
}
}
如上所示,实现BiFunction时利用了lambda表达式,原理与匿名函数相同,在此不多赘述。
再有一个很牛班的例子给出:
public static Integer getSum(Integer a, Integer b, BiFunction<Integer, Integer, Integer> biFunction) {
return biFunction.apply(a, b);
}
public static void main(String[] args) {
System.out.println(getSum(1,2,(a,b)->a+b));
System.out.println(getSum(1,2,(a,b)->a-b));
System.out.println(getSum(1,2,(a,b)->a*b));
System.out.println(getSum(2,2,(a,b)->a/b));
}
这个例子中,getSum函数直接在入参中定义了一个BiFunction的实例,因此在调用的时候println传参直接将bi实例以lambda表达式的形式创建并传入getSum函数中,从而实现并执行了表达式的功能
@Override 这个注解一般写在某个类的方法之前,验证该方法是否是继承的父类的方法并对相应的父类的方法进行覆写的,不是则抛出异常
beanfactory和factorybean