java8新特性

接口默认方法
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);
//最终str的结果为"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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值