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。
主要方法
- Optional.of:创建一个Optional,不能为null,赋值抛出NullPointerException。
- Optional.ofNullable:创建一个可以为 null 的 Optional。
- isPresent:值存在返回true,否则false。
- ifPresent:值存在就调用Consumer对象的accept方法,否则无任何动作。
- get:返回值,空Optional抛NoSuchElementException异常。
- orElse:值存在返回,否则返回指定值。
- orElseGet:值存在返回,否则调用Supplier的get返回。
- 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
- Java 8 新特性小结
- kafka0.8新特性小结
- Java 8新特性
- java 8新特性
- Java 8 新特性
- java 8 新特性
- Java 8新特性
- Java 8 新特性
- Java 8 新特性
- Java 8 新特性
- Java 8新特性
- Java 8新特性
- Java 8新特性
- Java 8新特性
- Java 8 新特性
- Java 8 新特性
- Java 8: 新特性
- Java 8新特性
- TSM12M触摸芯片注意事项
- 贪心算法——背包问题
- ArrayList
- 2017_12_05学习Java心得笔记
- 第十四周【项目
- Java 8 新特性小结
- Java集合框架上机练习题
- 2分钟实现Android点击更换头像功能
- TLS
- java 多线程-障栅CyclicBarrier
- 开发需要注意的小点
- 实训第三次博客
- P1256 显示图像 【队列维护bfs】
- C# 生成不重复的随机数