java8之常用新特性

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和

 总结:代码就是需要多学多练多敲,看的再多不如自己实践,希望以后自己在实践中将这些新特性都用起来吧

posted @ 2020-10-08 11:08  程序杰杰  阅读(135)  评论(0编辑  收藏  举报