一、十大特性

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

jdk8十大特性并代码demo(转)的更多相关文章

  1. ES6的十大特性和认知

    ---恢复内容开始--- ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率.本文主要针对E ...

  2. 前端开发者不得不知的es6十大特性(转)

    转载自AlloyTeam:http://www.alloyteam.com/2016/03/es6-front-end-developers-will-have-to-know-the-top-ten ...

  3. 前端开发者不得不知的ES6十大特性

    前端开发者不得不知的ES6十大特性 转载 作者:AlloyTeam 链接:http://www.alloyteam.com/2016/03/es6-front-end-developers-will- ...

  4. 不得不知的ES6十大特性

    ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率. 本文主要针对ES6做一个简要介绍. 主 ...

  5. ES6十大特性

    本文主要针对ES6做一个简要介绍. 主要译自:  http://webapplog.com/ES6/comment-page-1/.也许你还不知道ES6是什么, 实际上, 它是一种新的javascri ...

  6. 总结JAVA语言的十大特性

    JAVA语言的十大特性 1.简单 Java语言的语法简单明了,容易掌握从,而且Java语言是纯面向对象的语言. Java语言的语法规则和C++类似,从某种意义上来讲,Java原因是由C语言和C++语言 ...

  7. ECMAScript 6十大特性

    ES6入门 http://es6.ruanyifeng.com/ ES6排名前十的最佳特性列表 Default Parameters(默认参数) in ES6 Template Literals (模 ...

  8. jQuery Mobile高手必备的十大技巧和代码片段

    与任何新技术一样,常常难就难在如何开始入手. 有鉴于此,我们整理出了与jQuery Mobile库有关的我认为最便利的一些技巧.方法和代码片段. 由于本文不是旨在全面介绍使用jQuery Mobile ...

  9. ES6十大特性(转载CSDN)

    1. const和let关键字 const用于定义常量. let用于定义变量.但是JavaScript中不是已经有变量了吗? 是的,这很正确,但用var声明的变量具有函数作用域,并会被提升到顶部. 这 ...

随机推荐

  1. LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)

    本文转自:原文链接  http://www.cnblogs.com/doseoer/p/4367536.html 网上我看到有很多相关的文章都是简述这个问题的,但毕竟因为LINUX版本众多,很多LIU ...

  2. Python--re模块的findall等用法

    1)正则表达式含义 . # 点可代表一切字符 \ # 起转义作用 [...] # 指代方括号中的任意字符 \d # 指代数字0-9 \D # 指代非数字 \s # 指代一切空格,包括tab制表符.空格 ...

  3. 未能加载文件或程序集“System.Data.SQLite”

    未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误 ...

  4. openCV训练程序申请内存不足

     openCV训练程序申请内存不足   在用OpenCV训练分类器(特别是训练Adaboost类型的分类器)的时候,当样本的数量特别大的时候,就会出现申请内存不够的情况,很早以前碰到过这样的情况,最近 ...

  5. ImportError: No module named yum

    [root@localhost]# yum-complete-transactionTraceback (most recent call last):  File "/usr/sbin/y ...

  6. VuGen:一般选项General Option

  7. windbg调试相关命令

    windbg 查找函数:x exe!main* 条件断点打印字符:bp 7199a2b0 ".printf \"message:%ma\", poi(@esp+8);.e ...

  8. powershell 性能测试小脚本

    powershell 性能测试: 转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 1. 将待测试的脚本封装在代码块中 2. 使用  Get-Ch ...

  9. 利用linux判断elf文件是64位还是32位

    readelf 命令,参数为-h 例如 文件名为python >>>readelf -h python 得到的是ELF Header中的项Magic 第五个数 02时为64位,01时 ...

  10. Mybatis源码分析之结果集处理

    解析封装 ResultMap 是和结果集相关的东西,最初在解析 XML 的时候,于 parseStatementNode 方法中,针对每一个 select 节点进行解析,转换为 MappedState ...