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可测。
![](https://common.cnblogs.com/images/copycode.gif)
- 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声明的变量具有函数作用域,并会被提升到顶部. 这 ...
随机推荐
- LINUX下PHP编译添加相应的动态扩展模块so(不需要重新编译PHP,以openssl.so为例)
本文转自:原文链接 http://www.cnblogs.com/doseoer/p/4367536.html 网上我看到有很多相关的文章都是简述这个问题的,但毕竟因为LINUX版本众多,很多LIU ...
- Python--re模块的findall等用法
1)正则表达式含义 . # 点可代表一切字符 \ # 起转义作用 [...] # 指代方括号中的任意字符 \d # 指代数字0-9 \D # 指代非数字 \s # 指代一切空格,包括tab制表符.空格 ...
- 未能加载文件或程序集“System.Data.SQLite”
未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误 ...
- openCV训练程序申请内存不足
openCV训练程序申请内存不足 在用OpenCV训练分类器(特别是训练Adaboost类型的分类器)的时候,当样本的数量特别大的时候,就会出现申请内存不够的情况,很早以前碰到过这样的情况,最近 ...
- ImportError: No module named yum
[root@localhost]# yum-complete-transactionTraceback (most recent call last): File "/usr/sbin/y ...
- VuGen:一般选项General Option
- windbg调试相关命令
windbg 查找函数:x exe!main* 条件断点打印字符:bp 7199a2b0 ".printf \"message:%ma\", poi(@esp+8);.e ...
- powershell 性能测试小脚本
powershell 性能测试: 转载请注明: 仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/ 1. 将待测试的脚本封装在代码块中 2. 使用 Get-Ch ...
- 利用linux判断elf文件是64位还是32位
readelf 命令,参数为-h 例如 文件名为python >>>readelf -h python 得到的是ELF Header中的项Magic 第五个数 02时为64位,01时 ...
- Mybatis源码分析之结果集处理
解析封装 ResultMap 是和结果集相关的东西,最初在解析 XML 的时候,于 parseStatementNode 方法中,针对每一个 select 节点进行解析,转换为 MappedState ...