Java8重点新特性总结

Lambda表达式

lambda 表达式的语法格式如下:

(parameters) -> expression或(parameters) ->{statements; }

以下是lambda表达式的重要特征:

· 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。

· 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号

· 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。

· 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值

Lambda 表达式主要用来定义行内执行的方法类型接口

Lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在lambda 内部修改定义在域外的局部变量,否则会编译错误。

Lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有final 的语义

方法引用

  • 构造器引用:

    必须是无参的。语法是Class::new,或者更一般的Class< T >::new,要求构造器方法是没有参数;Java编译器会自动根据Factory.create方法的签名来选择函数。

Car car  = Car.create(Car::new);//相当于new了一个Car
  • 静态方法引用:

    静态方法引用:它的语法是Class::static_method,实例如下:

    直接::写就行

    cars.forEach(Car::collide);

  • 特定类的任意对象的方法引用:

    特定类的任意对象的方法引用:它的语法是Class::method实例如下:

    不用实例化,是这个类就行

    //这个方法没有参数,什么类都能用
    cars.forEach(Car::repair);

  • 特定对象的方法引用:

    特定对象的方法引用:它的语法是instance::method实例如下:

    即必须先实例化。具体话到某个对象了(方法有形参)

    final Car police = Car.create(Car::new);//先new
    cars.forEach(police::follow);//再调

函数式接口

@FunctionalInterface
//那么就可以使用Lambda表达式来表示该接口的一个实现(注:JAVA 8 之前一般是用匿名类实现的)

通过lambda表达式可以直接实现函数式接口

  • 接口默认方法

    默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。

    我们只需在方法名前面加个default关键字即可实现默认方法。

    他们的目的是为了解决接口的修改与现有的实现不兼容的问题。

    public interface vehicle {
        default void print() {
            System.out.println("我是一辆车!");
        }
    }

    如果一个类继承了多个接口(都有默认方法怎么办呢)

    1.自己重写方法

    2.还是要重写不过通过调用指定的默认方法也行。 放发内部写表达式: 某一个接口.super.默认方法()

  • Java 8 的另一个特性是接口可以声明(并且可以提供实现)静态方法。

    调用接口静态方法,直接 super.静态方法名 就行

public class Java8Tester {
    public static void main(String args[]) {
        Vehicle vehicle = new Car();
        vehicle.print();
    }
}
 
interface Vehicle {
    default void print() {
        System.out.println("我是一辆车!");
    }
 
    static void blowHorn() {
        System.out.println("按喇叭!!!");
    }
}
 
interface FourWheeler {
    default void print() {
        System.out.println("我是一辆四轮车!");
    }
}
 
class Car implements Vehicle, FourWheeler {
    public void print() {
        Vehicle.super.print();
        FourWheeler.super.print();
        Vehicle.blowHorn();
        System.out.println("我是一辆汽车!");
    }
}

Stream API

Java 8 API添加了一个新的抽象称为流Stream,

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象.

这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。4大管道技术:

  • 生成流

    在Java 8中,集合接口有两个方法来生成流:

    stream() −为集合创建串行流。

    parallelStream() − 为集合创建并行流。

  • forEach

  • distinct

  • map

  • filter

  • limit

  • sorted

  • collect(Collectors.***())

  • mapToInt

  • summaryStatistics();

Optional 类

public class Java8Tester {
    public static void main(String args[]) {
        Java8Tester java8Tester = new Java8Tester();
        Integer value1 = null;
        Integer value2 = new Integer(10);
        // Optional.ofNullable - 允许传递为 null 参数
        Optional<Integer> a = Optional.ofNullable(value1);
        // Optional.of - 如果传递的参数是 null,抛出异常 NullPointerException
        Optional<Integer> b = Optional.of(value2);
        System.out.println(java8Tester.sum(a, b));
    }
 
    public Integer sum(Optional<Integer> a, Optional<Integer> b) {
        // Optional.isPresent - 判断值是否存在
        System.out.println("第一个参数值存在: " + a.isPresent());
        System.out.println("第二个参数值存在: " + b.isPresent());
        // Optional.orElse - 值不存则在返回括号默认值
        Integer value1 = a.orElse(new Integer(0));
        //Optional.get - 获取值,值需要存在
        Integer value2 = b.get();
        return value1 + value2;
    }
}

还有很多其他方法

日期时间API

Java 8通过发布新的Date-Time API (JSR 310)来进一步加强对日期与时间的处理。

Java 8 在 java.time 包下提供了很多新的 API。以下为两个比较重要的 API:

  • Local(本地) − 简化了日期时间的处理,没有时区的问题。

  • Zoned(时区) − 通过制定的时区处理日期时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值