关闭

[Java]_[JDK1.8新特性]

标签: javajdk
229人阅读 评论(0) 收藏 举报
分类:

本文列举Java1.8的新特性,主要是参考网上别的博客和看官方文档总结。

接口的默认方法

Java 8允许我们给接口添加一个非抽象的方法实现,只需要使用 default关键字即可,这个特征又叫做扩展方法,示例如下:

interface Formula {
    double calculate(int a);

    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}

Formula接口中的sqrt方法前面加个default表示是默认方法,这样继承该接口的类可以不用实现这个方法,可以直接使用。

Formula formula = new Formula() {
    @Override
    public double calculate(int a) {
        return sqrt(a * 100);
    }
};

double s1 = formula.calculate(100);     // 100.0
double s2 = formula.sqrt(16);           // 4.0
System.out.print("s1:" + s1 + " s2:" + s2);

输出结果:
s1:100.0 s2:4.0

formula通过匿名内部类实现,代码还是比较好理解,注意默认方法除了实例对方可以调用外还可以在实现这个接口的方法时候使用,像方法calculate的实现直接使用sqrt这个默认方法。

接口的静态方法

java8现在可以在接口中实现静态方法,只需要static关键字即可,代码如下:

interface Hello
{
    public static String hello(String s)
    {
        return s;
    }
}

接口的静态方法和类的静态方法使用一样,无需实例便可以访问。

    public static void main(String[] args)
    {
        System.out.print(Hello.hello("hello world"));
    }

输出结果:
hello world

Lambal表达式

Lambal表达式只能用在函数式接口。这里先记住这点,后面会详解介绍函数式接口。这里先介绍三种使用Lambal表达式的例子。

排列字符串

首先看看在老版本的Java中是如何排列字符串的:

List<String> names = Arrays.asList("peter", "anna", "mike", "xenia");

Collections.sort(names, new Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return b.compareTo(a);
    }
});

只需要给静态方法 Collections.sort 传入一个List对象以及一个比较器来按指定顺序排列。通常做法都是创建一个匿名的比较器对象然后将其传递给sort方法。

在Java 8 中你就没必要使用这种传统的匿名对象的方式了,Java 8提供了更简洁的语法,lambda表达式:

Collections.sort(names, (String a, String b) -> {
    return b.compareTo(a);
});

看到了吧,代码变得更段且更具有可读性,但是实际上还可以写得更短:

Collections.sort(names, (String a, String b) -> b.compareTo(a));

对于函数体只有一行代码的,你可以去掉大括号{}以及return关键字,但是你还可以写得更短点:

Collections.sort(names, (a, b) -> b.compareTo(a));

遍历数组

再看看遍历数组的Lambal表达式使用,先看看传统的遍历方法:

List<String>lists = Arrays.asList("aaa","bbb","ccc","ddd");  
for (String string : lists) {  
    System.out.print(string);  
}  

Lambal表达式遍历:

List<String>lists = Arrays.asList("aaa","bbb","ccc","ddd");  
lists.forEach((str) -> System.out.println(str));

使用线程

传统调用线程的代码:

new Thread(new Runnable() {  
    @Override  
    public void run() {  
        // TODO Auto-generated method stub  
        for (int i = 0; i < 3; i++) {  
            System.out.println("use runnable is :"+i);  
        }  
    }  
}).start();  

Lambal表达式调用线程:

new Thread(()->{  
    for (int i = 0; i < 3; i++) {  
        System.out.println("use lambda is :"+i);  
    }  
}).start();  

函数式接口

函数式接口是指有且仅有一个抽象方法的接口(不包括默认方法),Lambal表达式只能用于函数式接口,像Collections.sort()第二个参数的那个接口就是函数式接口。为了确保你的接口一定达到这个要求,你只需要给你的接口添加 @FunctionalInterface 注解,编译器如果发现你标注了这个注解的接口有多于一个抽象方法的时候会报错的。
示例如下:

@FunctionalInterface
interface Converter<F, T> {
    T convert(F from);
}

public static void main(String[] args)
{
    Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
    Integer converted = converter.convert("123");
    System.out.println(converted);    // 123
}

JDK 1.8 API包含了很多内建的函数式接口,在老Java中常用到的比如Comparator或者Runnable接口,这些接口都增加了@FunctionalInterface注解以便能用在lambda上。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:38962次
    • 积分:982
    • 等级:
    • 排名:千里之外
    • 原创:62篇
    • 转载:1篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论
    Cocoa
    OSX下的Cocoa开发