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和

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

  • 相关阅读:
    LVS基于DR模式负载均衡的配置
    Linux源码安装mysql 5.6.12 (cmake编译)
    HOSt ip is not allowed to connect to this MySql server
    zoj 3229 Shoot the Bullet(无源汇上下界最大流)
    hdu 3987 Harry Potter and the Forbidden Forest 求割边最少的最小割
    poj 2391 Ombrophobic Bovines(最大流+floyd+二分)
    URAL 1430 Crime and Punishment
    hdu 2048 神、上帝以及老天爷(错排)
    hdu 3367 Pseudoforest(最大生成树)
    FOJ 1683 纪念SlingShot(矩阵快速幂)
  • 原文地址:https://www.cnblogs.com/ningxinjie/p/13780649.html
Copyright © 2011-2022 走看看