Java 8新特性
2019-05-04 21:44:06 0 举报
AI智能生成
Java8新特性小结
作者其他创作
大纲/内容
类库
Stream API
java.util.stream.Stream接口
支持集合元素的串、并行聚合操作
Stream 操作分为中间操作或者最终操作两种。
最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样就可以将多个操作依次串起来,形成链式调用。
最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,这样就可以将多个操作依次串起来,形成链式调用。
注意:一旦执行终止操作后就不能再使用了
java.util.stream.Collectors工具类
Collectors.toList()、Collectors.toSet()、Collectors.groupingBy()(分组)、Collectors.partitioningBy()(可替代if...else语句,进行条件划分)等方法
其它接口
如:IntStream、FloatStream、LongStream、DoubleStream等,其中包括
range
、rangeClosed、iterate
和 limit等方法
位于集合框架Collection接口的API中,可用来简化foreach循环代码,以及处理集合元素的计算、排序与统计等操作。
集合以表示数据为主,Stream流以计算为主
包括stream(创建串行流对象)、parallelStream(创建并行流对象)、filter(过滤元素)、map(映射)、reduce、collect(收集)、count(计数)等方法
新的Date/Time API (JSR 310)
包括LocalDate、LocalTime、LocalDateTime等
String类
新添加了一个新的join方法,该方法实现了字符串的拼接,可以把它看作split方法的逆操作
java.nio.file.Files类
为使用流读取文件行及访问目录项提供了一些简便的方法,如copy、list、walk、find、lines等方法
JDBC增强
新增API
java.sql.DriverAction
接口java.sql.SQLType 接口
java.sql.JDBCType 枚举
改变已有的接口
Optional类
用于防止NullPointerException的出现,避免null值判断。可配合Lambda表达式使用,使代码更简洁美观,包括(工厂方法of、ofNullable)、filter、map、orElse、get等方法
- 常用方法:
isPresent() :判断容器中是否有值。
ifPresent(Consume lambda) :容器若不为空则执行括号中的Lambda表达式。
T get() :获取容器中的元素,若容器为空则抛出NoSuchElement异常。
T orElse(T other) :获取容器中的元素,若容器为空则返回括号中的默认值
Base64类
提供原生Base64编码、解码支持,不需要再依赖第三方库
Base64.getEncoder().encodeToString(bytes)
Base64.getDecoder().decode(str)
并行(parallel)数组
Arrays类中增加对数组元素进行排序、过滤、分组相关并行操作API,比如parallelSort方法
java.util.concurrent 并发包
CompletionStage<T>接口
CompletableFuture类
函数式异步编程辅助类
实现了CompletionStage和Future接口
CompletionService
用于获取多个异步任务的执行结果
原理:将已经执行完成的任务保存在一个阻塞队列中,使用take、poll方法从队列中取出任务获得执行结果
由于队列的特性,可以保证先执行完成的任务先拿到结果,因此可以减少等待时间
实现类:ExecutorCompletionService
使用Executor来执行任务
java.util.concurrent.atomic 子包
增加 DoubleAccumulator、DoubleAdder、LongAccumulator、 LongAdder四个类
LongAdder VS AtomicLong
原有的Atomic系列类通过CAS来保证并发时操作的原子性,但是高并发也就意味着CAS的失败次数会增多,失败次数的增多会引起更多线程的重试,最后导致AtomicLong的效率降低。
低并发时两个类差不多,而高并发时使用LongAdder更高效
函数式编程
函数式编程是相对于命令式编程而言的,常见的面向对象、面向过程编程都属于命令式编程。
函数式编程关心数据的映射,命令式编程关心解决问题的步骤。
函数式编程关心数据的映射,命令式编程关心解决问题的步骤。
高阶函数
简言之,就是该函数的参数可以是函数,类似于C语言中的函数指针
语法
函数式接口
定义
只含有一个抽象方法的接口,或使用@FunctionalInterface注解的接口。
@FunctionalInterface注解和@Override用法类似,都是在编译期进行检查
@FunctionalInterface注解和@Override用法类似,都是在编译期进行检查
lambda表达式的类型就是函数式接口
内置函数接口
位于java.util.function包中
分类
Function<T, R>
数据转换,T和R分别表示 apply 方法的参数和返回值类型
Predicate<T>
条件测试,T表示 test 方法的参数类型,返回值为boolean类型
Consumer<T>
数据消费,T表示 accept 方法的参数类型
Supplier<T>
数据提供,T表示 get 方法的返回类型
用法
通常作为方法参数来使用(也可作为返回值):
Stream
的 map
方法接受Function<T, R>
作为参数,filter
使用Predicate<T>作为参数
,forEach
使用Consumer<T>
作为参数。 自定义函数接口
满足函数式接口的要求(只有一个抽象方法的接口),在IDE中可以使用
@FunctionalInterface
注解来验证该要求是否满足 lambda表达式
lambda表达式体现了数据输入(方法参数)与输出(返回结果)的对应关系,实际就是一个回调函数
语法:()->{}:分别表示“参数->方法体”,只有函数式接口(Functional Interface)能写成此形式
可用于替代匿名内部类,它与匿名内部类的区别:
① this关键字指向不同:匿名类中this指代当前匿名类对象,而lambda表达式中this指向包含它的类的对象。
② 编译方式不同:Java编译器将lambda表达式编译成类的私有方法,使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。
① this关键字指向不同:匿名类中this指代当前匿名类对象,而lambda表达式中this指向包含它的类的对象。
② 编译方式不同:Java编译器将lambda表达式编译成类的私有方法,使用了Java 7的 invokedynamic 字节码指令来动态绑定这个方法。
接口的默认方法default和静态方法static
方法引用
可用来替代传递lambda表达式,省略参数传递的表示,使代码更简洁和更具可读性
分类
构造器引用,如Integer::new
静态方法引用,如Integer::parseInt
特定类的任意对象的方法引用,语法是ClassName::method
特定对象的方法引用,语法是instance::method
变量类型推断机制,仅适用于lambda表达式中的参数类型推断
扩展注解的支持
重复注解
重复注解,允许一个注解同时出现多次。
注意:重复注解机制本身必须用@Repeatable注解。
注意:重复注解机制本身必须用@Repeatable注解。
@Repeatable:允许在同一声明类型(类,属性,或方法)上多次使用同一个注解
类型注解
为@Target元注解的ElementType枚举类型增加了TYPE_PARAMETER、TYPE_USE两个枚举值,扩展了注解的使用范围
编译器
运行时方法参数名字,可通过反射API与Parameter.getName()方法获取
0 条评论
下一页