java8新特性
<h2>1、lambda表达式和函数式接口</h2>
<pre><code>接口中有且只有一个抽象方法的接口,但是可以有默认方法(default)、静态方法(static)以及Object类的public方法。
使用lambda表达式的地方,方法声明时必须包含一个函数式的接口,换句话说,我们调用某方法,可以传入lambda表达式作为参数,则这个方法的参数类型,必定是一个函数式的接口。
使用场景:1.代替匿名内部类;2.对集合进行迭代;3.实现map与reduce;4.filter操作;5.与函数式接口Predicate配合
常见的函数式接口有:Runnable、Callable、Comparable、InvocationHandler、ActionListener、Consumer、Supplier、Function、Predicate、Specification等等。</code></pre>
<h2>2、接口的默认方法和静态方法</h2>
<pre><code>简单说,默认方法就是接口可以有实现方法,而且不需要实现类去实现其方法。只需在方法名前面加个default关键字即可实现默认方法。目的是为了解决接口的修改与现有的实现不兼容的问题。
接口可以声明(并且可以提供实现)静态方法</code></pre>
<h2>3、方法引用</h2>
<pre><code>什么是方法引用:方法引用通过方法的名字来指向一个方法。作用:方法引用可以使语言的构造更紧凑简洁,减少冗余代码。方法引用的形式:方法引用使用一对冒号 :: 。</code></pre>
<h2>4、重复注解</h2>
<pre><code>在Java 5中使用注解有一个限制,即相同的注解在同一位置只能声明一次。Java 8引入重复注解,这样相同的注解在同一地方也可以声明多次。重复注解机制本身需要用@Repeatable注解。
Java 8在编译器层做了优化,相同注解会以集合的方式保存,因此底层的原理并没有变化。</code></pre>
<h2>5、扩展注解的支持</h2>
<pre><code>java 8扩展了注解的上下文,几乎可以为任何东西添加注解,包括局部变量、泛型类、父类与接口的实现,连方法的异常也能添加注解。</code></pre>
<h2>6.Optional</h2>
<pre><code>Optional 是个容器:它可以保存类型T的值,或者仅仅保存null。Optional提供很多有用的方法,这样我们就不用显式进行空值检测。Optional 类的引入很好的解决空指针异常。</code></pre>
<h2>7、Stream</h2>
<pre><code>Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。Stream使用一种类似用SQL语句从数据库查询数据的直观方式来提供一种对Java集合运算和表达的高阶抽象。
这种风格将要处理的元素集合看作一种流,流在管道中传输,并且可以在管道的节点上进行处理,比如筛选,排序,聚合等。元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
Stream(流)是一个来自数据源的元素队列并支持聚合操作。流的特性:不存储数据、不改变原数据、延迟执行。
常用的操作:forEach:迭代流中的每个数据,map:映射每个元素到对应的结果,filter:通过设置条件过滤出元素,limit:获取指定数量的流,sorted:对流进行排序,Collectors:Collectors 类实现了很多归约操作,SummaryStatistics:统计。等等</code></pre>
<h2>8、Date/Time API</h2>
<pre><code>原有的日期/时间API(java.util.Date)存在诸多问题,如:非线程安全、设计差、时区处理麻烦等等。新的日期/时间API(java.time)有两个重要的API:Local(本地,没有时区问题)、Zoned(时区,通过制定的时区处理日期时间)</code></pre>
<h2>9、Base64</h2>
<pre><code>在Java8中,Base64编码已经成为Java类库的标准。内置了 Base64 编码的编码器和解码器。三种BASE64编解码器:基本、URL、MIME</code></pre>