java8中新特性有很多哦,今天研究一番,把常用的几个新特性列举出来,有一篇写的特别好的博客,链接如下:https://blog.csdn.net/yczz/article/details/50896975
新特性之一》》lambda表达式+接口中可以实现默认方法或者静态方法
lambda表达式的出现大大简化了代码的冗余,使得很多我们需要重写方法的大量代码,仅仅使用简洁的语言就可以实现。
这里的注意事项就是对于接口中如果内部只有一个abstract方法,其余的都是默认方法(default)或者静态方法,这样我们可以使用lambda表达式来实现。(需要注意的是,lambda表达式内部使用的变量会默认的加上final标识)
当然为了防止我们的lambda表达式不可用,我们可以在接口上加上@FunctionalInterface注解
新特性之二》》方法引用(更深刻的理解就是使得方法调用更加紧凑)【更加深入的理解就是为了更加简化lambda表达式(也就是说它能使用的地方一定是支持lambda表达式的,但是反之可就不一定了哦)
最好的理解:方法引用是为了使用lambda表达式更加简化
static class Car { //创建对象的时候都是使用Supplier这个类哦(当然也可以自己写一个和这个类一样的) public static Car create(Supplier<Car> supplier) { return supplier.get(); } public static void collide(Car car) { System.out.println("Collided " + car.toString()); } public void follow(Car another) { System.out.println("Following the " + another.toString()); } public void repair() { System.out.println("Repaired " + this.toString()); } } private void TestMethod2(){ Car car = Car.create(Car::new);//相当于调用无参构造函数 语法是Class::new List<Car> cars = Arrays.asList(car);//这样foreach下的每一个就是Car对象嘛 cars.forEach(Car::collide);//静态方法的引用(有一个参数) Class::static_method cars.forEach(Car::repair);//成员方法的引用(无入参) Class::method cars.forEach(new Car()::follow);//某个实例对象的成员方法的引用(有一个入参,入参就是foreach的每一个对象) instance::method }具体的四个使用在上方代码中都有标识
新特性之三》》Stream
Stream是位于Collection下的一个方法,它的出现让我们的程序代码更加轻松实现筛选等功能(和我以前使用C#中List下一串的lambda表达式很像)
private static class Streams { private enum Status { OPEN, CLOSED }; private static final class Task { private final Status status; private final Integer points; Task( final Status status, final Integer points ) { this.status = status; this.points = points; } public Integer getPoints() { return points; } public Status getStatus() { return status; } @Override public String toString() { return String.format( "[%s, %d]", status, points ); } } private void TestMethod3(){ final Collection< Task > tasks = Arrays.asList( new Task( Status.OPEN, 5 ), new Task( Status.OPEN, 13 ), new Task( Status.CLOSED, 8 ) ); //stream是Collection下的方法 int sum = tasks.stream().filter(x -> x.getStatus() == Status.OPEN).mapToInt(Task::getPoints).sum(); System.out.println(sum); } public static void main(String[] args) { new Streams().TestMethod3(); } }上方代码统计了Status状态为OPEN的points和
总结:代码就是需要多学多练多敲,看的再多不如自己实践,希望以后自己在实践中将这些新特性都用起来吧