java8 新特性

看了下java8的新特性,记下笔记,

1.添加了Optional,

这个是guava里面出现的,现在java8里面也支持了,Optional是用来处理null值的。

用法基本和guava里面的一致,

public static void main(String[] args) {
        Optional<String> str = Optional.of("abc");
        System.out.println(str.isPresent());
        System.out.println(str.get());
        
        str = Optional.empty();
        System.out.println(str.isPresent());
        System.out.println(str.orElse("abcd"));
    }

输出的值为:

true
abc
false
abcd

当里面有值的时候,使用orElse是会得到原来的值的,如当

Optional<String> str = Optional.of("abc");
       
        System.out.println(str.orElse("123"));

这时输出的是abc

2.接口中能添加默认方法了,示例如下

public interface Formula {
    double calculate(int a);

    /**
     * java8 新特性 接口中能添加默认方法,又叫做扩展方法,实现这个接口,不需要重写默认方法,可以直接用
     * @param a
     * @return
     */
    default double sqrt(int a) {
        return Math.sqrt(a);
    }
}

默认方法可以实现,需要用default关键字

实现这个接口的类不需要重写默认方法

3.@FunctionalInterface 注解,

用这个注解标记的接口会被认为是函数接口,即只有一个抽象方法(默认方法不是抽象方法),当有多个抽象方法的时候会出现编译错误提示

4.lambda表达式,这个是很多人都知道的变化

当实现函数式接口的时候可以使用lambda表达式

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

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

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

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

这上面四种写法是等效的

lambda表示式的基本形式为 () -> {}

当整个实现写在一行时,可以去掉小括号和return关键字,()里面的是参数,可以省略参数类型

5.方法和构造器的引用

示例:

public class Person {
    private String firstName;

    private String lastName;

    Person(){}

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

    public String getFirstName() {
        return firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public static void main(String[] args) {
        PersonFactory<Person> factory = Person::new;
        Person person = factory.createPerson("luo","lei");
        System.out.println(person.getFirstName()+" "+person.getLastName());
    }
}
public interface PersonFactory<T extends Person> {
    T createPerson(String firstName, String lastName);
}

使用::关键字,可以引用方法或构造器,这个接口只能是函数式接口

 

当然java8 还添加了一些接口,和其他的特性,我没看完

java8 的新特性就记录到这里 

posted on 2015-08-18 00:13  头机器人  阅读(207)  评论(0编辑  收藏  举报

导航