JAVA 8 特性

JAVA 8 新特性(1)

接口类的新写法

在JAVA8中,我们可以用default关键词在interface中添加非抽象类,也叫作 Extension Methods(扩展方法),例如

interface Formula {
    double calculate(int a);

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

使用的时候,我们可以像下面这么写:

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

Lambda表达式

首先,我们从看看怎么给某个集合排序,

List<String> names = Arrays.asList("张三", "李四", "王五", "赵六");

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

排序的写法是不是很复杂?

让我们来改进一下,

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

还可以更短

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

或者再短一点:

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

自己写函数式接口

每个Lambda方法都对应了接口中的某个类型,以此来通过JAVA的类型检测系统。所以,每个函数式接口必须只包含一个抽象方法,例如:

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

调用的时候,我们只要这么写

Converter<String, Integer> converter = (from) -> Integer.valueOf(from);
Integer converted = converter.convert("123");
System.out.println(converted);    // 123

注意,即使去掉@FunctionalInterface的注解,后面的程序也可以运行。

方法和构造器的引用

通过静态方法引用,上面的程序还可以进一步简化,如

Converter<String, Integer> converter = Integer::valueOf;
Integer converted = converter.convert("123");
System.out.println(converted);   // 123

注意,这里用的是::

还可以引用类中的方法,例如

class Something {
    String startsWith(String s) {
        return String.valueOf(s.charAt(0));
    }
}

调用方法如下:

Something something = new Something();
Converter<String, String> converter = something::startsWith;
String converted = converter.convert("Java");
System.out.println(converted);    // "J"

接下来,我们看看:: 怎么捏合构造器,看下面的代码

class Person {
    String firstName;
    String lastName;

    Person() {}

    Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }
}

然后,我们写一个工厂类,

interface PersonFactory<P extends Person> {
    P create(String firstName, String lastName);
}

通过构造器引用,我们可以把这两个方法揉在一起:

PersonFactory<Person> personFactory = Person::new;
Person person = personFactory.create("Peter", "Parker");
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值