接口默认方法
java78允许我们为接口提供一个默认的非抽象方法,只需要使用default关键字修饰该方法即可,这种方法也叫扩展方法,该方法的使用与一般的类使用普通方法是一样的,区别仅仅是他是接口的方法
public interface inter{
void tt();
default void test(){
System.out .println("hello default method" );
}
}
public class Test{
public static void main (String[] args){
inter ttt = new inter(){
@Override
public void tt (){
}
};
ttt.test();
}
}
当然我们也可以定义静态的默认方法,这也是可以的
Lambda表达式
在java8之前的版本我们对字符串进行排列的方式是如下:
List < String > names = Array . asList("peter" ,"maria" ,"nike" );
Collections. sort(names, new Comparator< String > (){
@Override
public int compare(String a, String b){
return b. compareTo(a);
}
});
通过Collections类的sort方法传入一个集合对象或者数据对象以一个比较器来对指定对象的内容进行排列
在java8中,简化了比较器的创建操作,我们只需要使用Lambda表达式就可以对对象进行排序了
Collections.sort(names,(String a, String b)->{return b.compareTo(a)}) ;
//也可以更简化
Collections .sort (names,(String a, String b)->b.compareTo(a)) ;
//java 编译器也可以自动检测出操作数的类型,因此可以不用再写数据类型
Collections .sort (names, (a, b)->b.compareTo(a)) ;
—>函数式接口(Lambda表示式扩展)
在java8中,我们可以将任意的只包含抽象方法的接口类型当做Lambda表达式,为了确保该接口能够满足这个条件,你可以在这个接口的定义前面添加注解前缀:@FunctionInterface;这样如果编译器发现了你标注了这个接口有多于一个抽象方法的定义就会报错的
@FunctionInterface
public Interface Convert<T,F>{
T convert(T from );
}
public class test{
public static void main(String[] args){
Convert<String, Integer> converter = (from )->Integer.valueOf(from );
Integer converted = converter.convert("111" );
}
}
—>lambda表达式可以访问的变量的作用域
lambda表达式可以访问表达式外层所处的方法的局部变量,不过该变量需要标注了final表示不可变,或者也可以不标记final,不过在后面不能再被改变,在lambda表达式内部也不能对该变量进行改变
final int num= 1 ;
Converted< Integer , String > converted = (from)-> String . valueOf(from+ num);
String str = converted. convert(2 );
lambda表达式可以直接访问实例的字段以及静态变量,与局部变量不同的是,他可以对实例的字段以及静态变量进行读写操作
class Lambda4 {
static int outerStaticNum;
int outerNum;
void testScopes() {
Converter<Integer, String> stringConverter1 = (from) -> {
outerNum = 23 ;
return String.valueOf(from);
};
Converter<Integer, String> stringConverter2 = (from) -> {
outerStaticNum = 72 ;
return String.valueOf(from);
};
}
}
lambda表达式不能访问接口的默认方法
在第一个新特性中的接口的默认方法中,该接口的默认方法可以直接被该接口的实例包括匿名对象所访问到,然而在lambda表达式中是不能访问接口的默认方法的
java8的api提供了很多全新的函数式接口,通过使用这些接口,可以让很多工作变得很方便;这里就不列举出来了,有兴趣的可以查看api