热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

JDK8-十大新特性-附demo

JDK9原计划17年上半年就发版,但未成功发版。才发现JDK8的特性还没总结过,特此总结。一、十大特性。1.Lambda表达式2.Stream函数式操作流元素集合3.接口新增:默认方法与静态方

JDK9原计划17年上半年就发版,但未成功发版。才发现JDK8的特性还没总结过,特此总结。

一、十大特性。

1.Lambda表达式

2.Stream函数式操作流元素集合

3.接口新增:默认方法与静态方法

4.方法引用,与Lambda表达式联合使用

5.引入重复注解

6.类型注解

7.最新的Date/Time API (JSR 310)

8.新增base64加解密API

9.数组并行(parallel)操作

10.JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)元空间

 

二、demo

demo基于junit可测。

  1 /**
2 *
3 * @ClassName:JDK8_features
4 * @Description:JDK8新特性
5 * @author diandian.zhang
6 * @date 2017年4月17日上午9:13:24
7 */
8 public class JDK8_features {
9
10 public List list = Lists.newArrayList(1,2,3,4,5,6,7,8,9,10);
11
12 /**
13 * 1.Lambda表达式
14 */
15 @Test
16 public void testLambda(){
17 list.forEach(System.out::println);
18 list.forEach(e -> System.out.println("方式二:"+e));
19 }
20
21 /**
22 * 2.Stream函数式操作流元素集合
23 */
24 @Test
25 public void testStream(){
26 List nums = Lists.newArrayList(1,1,null,2,3,4,null,5,6,7,8,9,10);
27 System.out.println("求和:"+nums
28 .stream()//转成Stream
29 .filter(team -> team!=null)//过滤
30 .distinct()//去重
31 .mapToInt(num->num*2)//map操作
32 .skip(2)//跳过前2个元素
33 .limit(4)//限制取前4个元素
34 .peek(System.out::println)//流式处理对象函数
35 .sum());//
36 }
37
38 /**
39 * 3.接口新增:默认方法与静态方法
40 * default 接口默认实现方法是为了让集合类默认实现这些函数式处理,而不用修改现有代码
41 * (List继承于Iterable,接口默认方法不必须实现default forEach方法)
42 */
43 @Test
44 public void testDefaultFunctionInterface(){
45 //可以直接使用接口名.静态方法来访问接口中的静态方法
46 JDK8Interface1.staticMethod();
47 //接口中的默认方法必须通过它的实现类来调用
48 new JDK8InterfaceImpl1().defaultMethod();
49 //多实现类,默认方法重名时必须复写
50 new JDK8InterfaceImpl2().defaultMethod();
51 }
52
53 public class JDK8InterfaceImpl1 implements JDK8Interface1 {
54 //实现接口后,因为默认方法不是抽象方法,重写/不重写都成!
55 // @Override
56 // public void defaultMethod(){
57 // System.out.println("接口中的默认方法");
58 // }
59 }
60
61 public class JDK8InterfaceImpl2 implements JDK8Interface1,JDK8Interface2 {
62 //实现接口后,默认方法名相同,必须复写默认方法
63 @Override
64 public void defaultMethod() {
65 //接口的
66 JDK8Interface1.super.defaultMethod();
67 System.out.println("实现类复写重名默认方法!!!!");
68 }
69 }
70
71 /**
72 * 4.方法引用,与Lambda表达式联合使用
73 */
74 @Test
75 public void testMethodReference(){
76 //构造器引用。语法是Class::new,或者更一般的Class::new,要求构造器方法是没有参数;
77 final Car car = Car.create( Car::new );
78 final List cars = Arrays.asList( car );
79 //静态方法引用。语法是Class::static_method,要求接受一个Class类型的参数;
80 cars.forEach( Car::collide );
81 //任意对象的方法引用。它的语法是Class::method。无参,所有元素调用;
82 cars.forEach( Car::repair );
83 //特定对象的方法引用,它的语法是instance::method。有参,在某个对象上调用方法,将列表元素作为参数传入;
84 final Car police = Car.create( Car::new );
85 cars.forEach( police::follow );
86 }
87
88 public static class Car {
89 public static Car create( final Supplier supplier ) {
90 return supplier.get();
91 }
92
93 public static void collide( final Car car ) {
94 System.out.println( "静态方法引用 " + car.toString() );
95 }
96
97 public void repair() {
98 System.out.println( "任意对象的方法引用 " + this.toString() );
99 }
100
101 public void follow( final Car car ) {
102 System.out.println( "特定对象的方法引用 " + car.toString() );
103 }
104 }
105
106 /**
107 * 5.引入重复注解
108 * 1.@Repeatable
109 * 2.可以不用以前的“注解容器”写法,直接写2次相同注解即可
110 *
111 * Java 8在编译器层做了优化,相同注解会以集合的方式保存,因此底层的原理并没有变化。
112 */
113 @Test
114 public void RepeatingAnnotations(){
115 RepeatingAnnotations.main(null);
116 }
117
118 /**
119 * 6.类型注解
120 * 新增类型注解:ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER(在Target上)
121 *
122 */
123 @Test
124 public void ElementType(){
125 Annotations.main(null);
126 }
127
128 /**
129 * 7.最新的Date/Time API (JSR 310)
130 */
131 @Test
132 public void DateTime(){
133 //1.Clock
134 final Clock clock = Clock.systemUTC();
135 System.out.println( clock.instant() );
136 System.out.println( clock.millis() );
137
138 //2. ISO-8601格式且无时区信息的日期部分
139 final LocalDate date = LocalDate.now();
140 final LocalDate dateFromClock = LocalDate.now( clock );
141
142 System.out.println( date );
143 System.out.println( dateFromClock );
144
145 // ISO-8601格式且无时区信息的时间部分
146 final LocalTime time = LocalTime.now();
147 final LocalTime timeFromClock = LocalTime.now( clock );
148
149 System.out.println( time );
150 System.out.println( timeFromClock );
151
152 // 3.ISO-8601格式无时区信息的日期与时间
153 final LocalDateTime datetime = LocalDateTime.now();
154 final LocalDateTime datetimeFromClock = LocalDateTime.now( clock );
155
156 System.out.println( datetime );
157 System.out.println( datetimeFromClock );
158
159 // 4.特定时区的日期/时间,
160 final ZonedDateTime zOnedDatetime= ZonedDateTime.now();
161 final ZonedDateTime zOnedDatetimeFromClock= ZonedDateTime.now( clock );
162 final ZonedDateTime zOnedDatetimeFromZone= ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) );
163
164 System.out.println( zonedDatetime );
165 System.out.println( zonedDatetimeFromClock );
166 System.out.println( zonedDatetimeFromZone );
167
168 //5.在秒与纳秒级别上的一段时间
169 final LocalDateTime from = LocalDateTime.of( 2014, Month.APRIL, 16, 0, 0, 0 );
170 final LocalDateTime to = LocalDateTime.of( 2015, Month.APRIL, 16, 23, 59, 59 );
171
172 final Duration duration = Duration.between( from, to );
173 System.out.println( "Duration in days: " + duration.toDays() );
174 System.out.println( "Duration in hours: " + duration.toHours() );
175 }
176
177 /**
178 * 8.新增base64加解密API
179 */
180 @Test
181 public void testBase64(){
182 final String text = "就是要测试加解密!!abjdkhdkuasu!!@@@@";
183 String encoded = Base64.getEncoder()
184 .encodeToString( text.getBytes( StandardCharsets.UTF_8 ) );
185 System.out.println("加密后="+ encoded );
186
187 final String decoded = new String(
188 Base64.getDecoder().decode( encoded ),
189 StandardCharsets.UTF_8 );
190 System.out.println( "解密后="+decoded );
191 }
192
193 /**
194 * 9.数组并行(parallel)操作
195 */
196 @Test
197 public void testParallel(){
198 long[] arrayOfLOng= new long [ 20000 ];
199 //1.给数组随机赋值
200 Arrays.parallelSetAll( arrayOfLong,
201 index -> ThreadLocalRandom.current().nextInt( 1000000 ) );
202 //2.打印出前10个元素
203 Arrays.stream( arrayOfLong ).limit( 10 ).forEach(
204 i -> System.out.print( i + " " ) );
205 System.out.println();
206 //3.数组排序
207 Arrays.parallelSort( arrayOfLong );
208 //4.打印排序后的前10个元素
209 Arrays.stream( arrayOfLong ).limit( 10 ).forEach(
210 i -> System.out.print( i + " " ) );
211 System.out.println();
212 }
213
214 /**
215 * 10.JVM的PermGen空间被移除:取代它的是Metaspace(JEP 122)元空间
216 */
217 @Test
218 public void testMetaspace(){
219 //-XX:MetaspaceSize初始空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整
220 //-XX:MaxMetaspaceSize最大空间,默认是没有限制
221 //-XX:MinMetaspaceFreeRatio在GC之后,最小的Metaspace剩余空间容量的百分比,减少为分配空间所导致的垃圾收集
222 //-XX:MaxMetaspaceFreeRatio在GC之后,最大的Metaspace剩余空间容量的百分比,减少为释放空间所导致的垃圾收集
223 }
224
225 }
引用到的相关类:
 1 public interface JDK8Interface1 {
2
3 //1.接口中可以定义静态方法了
4 public static void staticMethod(){
5 System.out.println("接口中的静态方法");
6 }
7
8 //2.使用default之后就可以定义普通方法的方法体了
9 public default void defaultMethod(){
10 System.out.println("接口中的默认方法");
11 }
12 }
13
14 public interface JDK8Interface2 {
15
16 //接口中可以定义静态方法了
17 public static void staticMethod(){
18 System.out.println("接口中的静态方法");
19 }
20 //使用default之后就可以定义普通方法的方法体了
21 public default void defaultMethod(){
22 System.out.println("接口中的默认方法");
23 }
24 }
25
26 /**
27 *
28 * @ClassName:RepeatingAnnotations
29 * @Description:重复注解@Repeatable
30 * @author diandian.zhang
31 * @date 2017年3月31日下午3:48:13
32 */
33 public class RepeatingAnnotations {
34 @Target( ElementType.TYPE )
35 @Retention( RetentionPolicy.RUNTIME )
36 public @interface Filters {
37 Filter[] value();
38 }
39
40 @Target( ElementType.TYPE )
41 @Retention( RetentionPolicy.RUNTIME )
42 @Repeatable( Filters.class )
43 public @interface Filter {
44 String value();
45 String value2();
46 };
47
48 @Filter( value="filter1",value2="111" )
49 @Filter( value="filter2", value2="222")
50 //@Filters({@Filter( value="filter1",value2="111" ),@Filter( value="filter2", value2="222")}).注意:JDK8之前:1.没有@Repeatable2.采用本行“注解容器”写法
51 public interface Filterable {
52 }
53
54 public static void main(String[] args) {
55 //获取注解后遍历打印值
56 for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) {
57 System.out.println( filter.value() +filter.value2());
58 }
59 }
60 }
61
62 /**
63 *
64 * @ClassName:Annotations
65 * @Description:新增类型注解:ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER(在Target上)
66 * @author diandian.zhang
67 * @date 2017年3月31日下午4:39:57
68 */
69 public class Annotations {
70 @Retention( RetentionPolicy.RUNTIME )
71 @Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )
72 public @interface NonEmpty {
73 }
74
75 public static class Holder<@NonEmpty T > extends @NonEmpty Object {
76 public void method() throws @NonEmpty Exception {
77 }
78 }
79
80 public static void main(String[] args) {
81 final Holder holder = new @NonEmpty Holder();
82 @NonEmpty Collection<@NonEmpty String > strings = new ArrayList<>();
83 }
84 }

 

 


推荐阅读
  • 1、创建高级对象使用构造函数来创建对象构造函数是一个函数,调用它来例示并初始化特殊类型的对象。可以使用new关键字来调用一个构造函数。下面给出了使用构造函数的新示例。 ... [详细]
  • Qt 学习笔记(5)绘图   五子棋游戏
    在上一篇博客CQt学习笔记(4)绘图中介绍了Qt中的绘图方法,基于上一篇的博客的知识,使用QPainter设计一个五子棋的棋 ... [详细]
  • 子元素过滤器在页面设计过程中需要突出某些行时,可以通过基本过滤选择器中的:eq()来实现表单中行的凸显,但不能同时让多个表具有相同的效果。在jQuer ... [详细]
  • 在开发四国军棋的游戏中,通过flex联机游戏开发-四国军棋游戏(五)-提炼棋类开发api,我们提炼出了第一个关于棋类游戏开发的api-FlexChessAPI,这个a ... [详细]
  • Kryo的语法与java序列化相似.创建kryo对象以及输出输入,并使用kryos方法之一来执行序列化反序列化kryo.writeClassAndObject(output,ob ... [详细]
  • 问题说明最近看到Spring事务,在学习过程中遇到一个很苦恼问题搭建好Spring的启动环境后出现了一点小问题在启动时候却出现[java.lang.NullPointerExcep ... [详细]
  • SortalinkedlistinO(nlogn)timeusingconstantspacecomplexity.这道题属于人生中第一次对链表进行操作,首先,不同于C++中的st ... [详细]
  • 本文整理了Java中org.apache.hadoop.mapreduce.lib.input.MultipleInputs.addInputPath()方法的一些代码 ... [详细]
  • oracle text db2,从Oracle 到DB2(一)
    在实际的软件项目的开发过程中,特别是在企业的应用系统集成(EAI)项目中广大开发人员经常遇到不同关系型数据库之间的数据移植问题。笔者根据自己在工作中的不同数据库数据移 ... [详细]
  • IPVlan 详解
    文章目录简介Ipvlan2同节点Ns互通Ns内与宿主机通信第三种方法Ns到节点外部结论Ipvlan31.同节点Ns互通Ns内与宿主机通信Ns内到外部网络总结源码分析ipvlan收包 ... [详细]
  • 媒介这里大部份是本身碰到过的状况,另有一部份自创了偕行的文章,假如人人有碰到别的坑,迎接提出来一同研讨。学问要点1.Meta标签1.制止用户缩放页面,页面强迫让文档的宽度与装备的宽 ... [详细]
  • 1、对于List而言,要不然就使用迭代器,要不然就从后往前删除,从前往后删除会出现角标越界。因为我List有两个remove方法,一个是int作为形参(删除指定位置的元素),一个是 ... [详细]
  • 手机49kbps转换比特率256Kpbs{‘corpus_no’:‘7045177033217452815’,‘err_msg’:‘success.’,‘err_no’:0,‘re ... [详细]
  • 使用ffmpeg进行视频格式转换的简单例子2006-12-1623:12主要参考FFMPEG里面的apiexample.c以及output_example.c编写intmain(in ... [详细]
  • Java学习日志(241网络编程自定义服务端与客户端)
    为什么80%的码农都做不了架构师?自定义服务端*演示客户端与服务端客户端:浏览器服务端:自定义*importjava.net.*;importjava ... [详细]
author-avatar
花亜_277
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有