zoukankan      html  css  js  c++  java
  • 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和

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

  • 相关阅读:
    查找文件的绝对路径
    购买成都二手商品房交易流程(卖方存在欠银行贷款的情况)
    针对CCTV摄像头的扫描爆破工具 :Cameradar
    交换机的基本配置
    思科交换机和路由器的远程配置
    安装Windows和Ubuntu双系统--Ubuntu安装过程识别不了硬盘
    SpringBoot 配置
    Tomcat9在CentOS7上启动慢解决办法,实测可行
    Linux安装JDK
    电影分享——《小丑》
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13780649.html
Copyright © 2011-2022 走看看