Java 8 新特性小结

来源:互联网 发布:搞笑视频配音软件 编辑:程序博客网 时间:2024/05/17 21:48

参考文章链接
Java8 lambda表达式10个示例
Java 8新特性终极指南

小结

1. Lambda表达式(闭包);
2. 函数式编程支持: java.util.function.* 下的众多接口;
3. 流API;
4. 接口的默认方法和静态方法;
5. 新的Date和Time API。

1 Optional 接口

Java 8 Optional类深度解析
Optional 类对对象的 null 值检测进行包装,如果值存在则 isPresent 返回true,否则 false。

主要方法

  1. Optional.of:创建一个Optional,不能为null,赋值抛出NullPointerException。
  2. Optional.ofNullable:创建一个可以为 null 的 Optional。
  3. isPresent:值存在返回true,否则false。
  4. ifPresent:值存在就调用Consumer对象的accept方法,否则无任何动作。
  5. get:返回值,空Optional抛NoSuchElementException异常。
  6. orElse:值存在返回,否则返回指定值。
  7. orElseGet:值存在返回,否则调用Supplier的get返回。
  8. orElseThrow:存在返回,否则抛出指定异常。
    map、flatMap、filter

2 Lambda

Lambda表达式允许将函数作为一个方法参数传递,或许将代码看成数据。
用 () -> {} 代替整个匿名类。

new Thread( () -> {int i = 9 ; System.out.println(“somting”+i) ; }).start();

() 中参数可省略类型,没有参数时 () 仍然要保留。
{} 只有一条语句时 {} 可以省略,语句尾的 ; 也可以省略。

Arrays.asList(“a”, “b”, “c”, “d”).forEach(va -> System.out.println(va));

3 FunctionalInterface

函数式接口,如果一个接口只有一个方法,那么编译器会将该接口视为函数式接口,如果在接口上加 FunctionalInterface 注解,那么接口就会被强制要求符合函数式接口的规范(只有一个抽象方法,默认,静态方法不包括在内)。

4 Predicate 接口

适用于过滤元素。
该接口有一个test方法,返回boolean,表示检查结果。提供了类似于逻辑操作符AND和OR的方法and()、or()、xor()。可以将多个条件进行组合。

Predicate testStart = (str) -> str.startsWith(“a”);
Predicate testContain = (str) -> str.contains(“b”);
boolean result = testStart.and(testContain).test(“acvvb”); // true

5 Map 的 Reduce

使用示例:map方法(Function接口)遍历并将每一个数乘以2,reduce(BiFunction接口)方法将结果汇总于sum。

List list = Arrays.asList(1, 2, 3, 4, 5, 6);
Optional reduce = list.stream().map(va -> va >> 1).reduce((sum, cur) -> sum += cur);
o.accept(reduce.orElse(-1));

6 Function

7 BiFunction

8 过滤集合元素

示例:Filter方法(Predicate接口)遍历元素并检查,返回true保留,collect方法(Collector接口)将结果组合为新的集合。

List list = Arrays.asList(1, 2, 3, 4, 5, 6);
List collect = list.stream().filter(va -> va % 2 == 0).collect(Collectors.toList());
o.accept(collect);

9 Supplier接口

用来产生对象

T get();

10 计算集合元素的最大,最小,总和以及平均值

IntStream、LongStream和DoubleStream中有个summaryStatics方法,可以返回IntSummaryStatics、LongSummaryStatics或DoubleSummaryStatics,描述流中的各种摘要数据。
Stream的mapToInt/Long/Double方法可将指定对象作为参数,产生对应的基本类型,mapXXX中接受的接口为:ToInt/Long/DoubleFunction,方法为(以int为例):int applyToInt(T value);

List list = Arrays.asList(1, 2, 3, 4, 5, 6);
IntSummaryStatistics statistics = list.stream().mapToInt(i -> i).summaryStatistics();
statistics.getMax();
statistics.getMin();
statistics.getAverage();
statistics.getSum();
statistics.getCount();

11 Lambda VS 匿名内部类

this关键字:匿名类的this指向匿名类,而Lambda的this指向外部类。
编译方式:Lambda被编译为外部类的私有成员方法,而匿名类被编译为单独的类。
同:两种方式在引用外部的局部变量时局部变量要被final修饰。
11 方法引用
List cars = new ArrayList<>();
1. 方法构造器(无参可访问的构造器)引用:Class::new ,可以便捷的创建一个对象,通常配合Supplier接口使用。
2. 引用静态方法(一参可访问):Class::static_method,通常配合Consumer接口使用。
3. 引用特定类的方法(无参可访问):Class::method
4. 引用特定对象的方法:instance::method

12 新的Date/Time API

在java.time.*包下:
新的API涵盖了所有处理日期、时间、时区、过程与时钟的操作。

(1) Clock类

UTC(Universal Time Coordinated)为世界协调时间,与格林尼治时间一样,与英国伦敦时间也一样。北京是东八区,领先于UTC8个小时。

Clock clock = Clock.systemUTC();
Instant instant = clock.instant();
Instant plus = instant.plus(8, ChronoUnit.HOURS);// 加 8 小时

    Instant minus = instant

// .plus(24 * 60 * 60 * 1000, ChronoUnit.MILLIS) // 加一天
.minus(24 * 60 * 60 * 1000, ChronoUnit.MILLIS);// 减一天
o.accept(instant); // UTC 时间:2017-10-24T07:11:12.576Z
o.accept(plus);// 北京时间:2017-10-24T15:11:12.576Z
o.accept(minus);// UTC 时间减一天:2017-10-23T07:11:12.576Z

(2) LocalDate、LocalTime和LocalDateTime

三者只持有ISO-8601格式具有时区信息的日期与时间。前两者都可以从Clock中获得。

Clock clock = Clock.systemUTC();
LocalDate date = LocalDate.now();
LocalTime time = LocalTime.now(clock);
LocalDateTime dateTime = LocalDateTime.now();
o.accept(date); //2017-10-24
o.accept(time); // 07:22:07.781 系统时间:15:22:37.050
o.accept(time.getNano()); // 319000000
o.accept(dateTime); // 2017-10-24T15:23:54.109

(3) Duration

在秒与纳秒级别上的一段时间。简化了计算两个时间差的不同。

Duration duration = Duration.between(
LocalDateTime.of(2014, Month.JULY, 13, 21, 0, 0), // 2014-07-13 21:00:00
LocalDateTime.of(2014, Month.JULY, 14, 22, 13, 16)); // 2014-07-14 22:13:16
o.accept(duration.toDays()); // 1
o.accept(duration.toHours()); // 25
o.accept(duration.toMinutes()); // 1513
o.accept(duration.toNanos()); // 90796000000000


— END —

原创粉丝点击