jdk8十大特性并代码demo(转)
一、十大特性
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<Integer> 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<Integer> 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<T>,接口默认方法不必须实现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< T >::new,要求构造器方法是没有参数;
77 final Car car = Car.create( Car::new );
78 final List< Car > 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< Car > 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 }
jdk8十大特性并代码demo(转)的更多相关文章
- ES6的十大特性和认知
---恢复内容开始--- ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率.本文主要针对E ...
- 前端开发者不得不知的es6十大特性(转)
转载自AlloyTeam:http://www.alloyteam.com/2016/03/es6-front-end-developers-will-have-to-know-the-top-ten ...
- 前端开发者不得不知的ES6十大特性
前端开发者不得不知的ES6十大特性 转载 作者:AlloyTeam 链接:http://www.alloyteam.com/2016/03/es6-front-end-developers-will- ...
- 不得不知的ES6十大特性
ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率. 本文主要针对ES6做一个简要介绍. 主 ...
- ES6十大特性
本文主要针对ES6做一个简要介绍. 主要译自: http://webapplog.com/ES6/comment-page-1/.也许你还不知道ES6是什么, 实际上, 它是一种新的javascri ...
- 总结JAVA语言的十大特性
JAVA语言的十大特性 1.简单 Java语言的语法简单明了,容易掌握从,而且Java语言是纯面向对象的语言. Java语言的语法规则和C++类似,从某种意义上来讲,Java原因是由C语言和C++语言 ...
- ECMAScript 6十大特性
ES6入门 http://es6.ruanyifeng.com/ ES6排名前十的最佳特性列表 Default Parameters(默认参数) in ES6 Template Literals (模 ...
- jQuery Mobile高手必备的十大技巧和代码片段
与任何新技术一样,常常难就难在如何开始入手. 有鉴于此,我们整理出了与jQuery Mobile库有关的我认为最便利的一些技巧.方法和代码片段. 由于本文不是旨在全面介绍使用jQuery Mobile ...
- ES6十大特性(转载CSDN)
1. const和let关键字 const用于定义常量. let用于定义变量.但是JavaScript中不是已经有变量了吗? 是的,这很正确,但用var声明的变量具有函数作用域,并会被提升到顶部. 这 ...
随机推荐
- Shell语言系列之一:文件处理
前言   标准输入/输出可能是软件工具设计原则里最基本的观念了.有很多UNIX程序都遵循这一设计历练.默认情况下,他们会读取标准输入,写入标准输出,并将错误信息传递给标准错误输出. & ...
- HDU3974 Assign the task(多叉树转换为线段+线段树区间染色)
题目大意:有n个人,给你他们的关系(老板和员工),没有直属上司的人就是整个公司的领导者,这意味着n个人形成一棵树(多叉树).当一个人被分配工作时他会让他的下属也做同样的工作(并且立即停止手头正在做的工 ...
- 【hdoj_1002】A+B Problem ||(大数)
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1002 题目提示,相加的两个数的位数可能很大(最多可达1000位),而int最多32位,long long类 ...
- centos7 开放端口号
firewall-cmd --zone=public --add-port=80/tcp --permanent firewall-cmd --reload
- Python中列表的各种方法
列表是Python中一种常用的存储信息的方式,所以要熟练掌握列表的各种方法: 首先我们定义一个列表(name),然后练习里面的各种方法: >>> name = ["Sora ...
- review-反思当程序猿的小一年来
误打误撞进入这个行业,也算是缘分把,不到一年的时光里,剖析一下自己,别写了半天代码,学了一堆东西,不知道干嘛.反省一下. 1.目标与知识库 就目前在我看来,是想成为一名优秀的数据工程师,掌握全栈数据分 ...
- jvisualvm 远程连接jboss
由于项目中使用jboss 作为web容器,每当项目上线时需要使用loadrunner对项目进行性能压测,这时就需要实时观察JVM的一些参数.想使用jvisualvm借助jstatd远程连接服务器上面的 ...
- html 条件注释判断浏览器版本<!--[if lt IE 9]>
<!--[if lte IE 8]><script>window.location.href='http://support.dmeng.net/upgrade-your-br ...
- 开源IDS系列--解决barnyard2 停止运行 libmysqlclient.so.16.0.0
现象: barnyard2运行一段时间后,会自行停止,未在/var/log/barnyard2或/var/log/suricata中发现相关日志. 排查: 在/var/log/message中存在以下 ...
- loadrunner 学习笔记--AJAX
用loadrunner测试WEB程序的时候总是会碰到AJAX或者ActiveX实现的功能,而通常这些功能会包含很多客户端函数(一般为JavaScript).我们该如何处理?如果从功能实现的角度去考虑这 ...