<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12
      轉載和引用,請注明原文出處! Fork me on GitHub
      結局很美妙的事,開頭并非如此!

      InterV 10:JDK8十大新特性轉載(不只十個新特性,還有很多)

      原文鏈接:http://www.rzrgm.cn/dennyzhangdd/p/6722445.html

      一、十大新特性

      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)元空間

      二、使用樣例

      1.Lambda表達式

      /**
           * 1.Lambda表達式
           */
          @Test
          public void testLambda(){
              List<Integer> list = new ArrayList<>();
              list.add(1);
              list.add(2);
              list.add(3);
              list.add(4);
              list.add(5);
              list.add(6);
              list.add(7);
              list.add(8);
              list.add(9);
              list.add(10);
              // 寫成System.out::println,這種語法叫做方法引用。該功能特性也是JDK8以后引入的
              list.forEach(System.out::println);
              // 等價于
              list.forEach(e -> System.out.println("方式二:"+e));
          }

      輸出:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      方式二:1
      方式二:2
      方式二:3
      方式二:4
      方式二:5
      方式二:6
      方式二:7
      方式二:8
      方式二:9
      方式二:10

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

      /**
           * 2.Stream函數式操作流元素集合
           */
          @Test
          public void testStream(){
              List<Integer> nums = new ArrayList<>();
              nums.add(1);
              nums.add(1);
              nums.add(null);
              nums.add(2);
              nums.add(3);
              nums.add(4);
              nums.add(null);
              nums.add(5);
              nums.add(6);
              nums.add(7);
              nums.add(8);
              nums.add(9);
              nums.add(10);
              
              System.out.println("求和:"+nums
                      .stream()//轉成Stream
                      .filter(team -> team!=null)//過濾
                      .distinct()//去重
                      .mapToInt(num->num*2)//map操作
                      .skip(2)//跳過前2個元素
                      .limit(4)//限制取前4個元素
                      .peek(System.out::println)//流式處理對象函數
                      .sum());//
          }

      輸出:

      6
      8
      10
      12
      求和:36

      3.接口新增:默認方法與靜態方法

      /**
           * 3.接口新增:默認方法與靜態方法
           *  default 接口默認實現方法是為了讓集合類默認實現這些函數式處理,而不用修改現有代碼
           *  (List繼承于Iterable<T>,接口默認方法不必須實現default forEach方法)
           */
          @Test
          public void testDefaultFunctionInterface(){
              //可以直接使用接口名.靜態方法來訪問接口中的靜態方法
              JDK8Interface1.staticMethod();
              //接口中的默認方法必須通過它的實現類來調用
              new JDK8InterfaceImpl1().defaultMethod();
              //多實現類,默認方法重名時必須復寫
              new JDK8InterfaceImpl2().defaultMethod();
          }
       public class JDK8InterfaceImpl1 implements JDK8Interface1 {
              //實現接口后,因為默認方法不是抽象方法,重寫/不重寫都成!
      //        @Override
      //        public void defaultMethod(){
      //            System.out.println("接口中的默認方法");
      //        }
          }
          
          public class JDK8InterfaceImpl2 implements JDK8Interface1,JDK8Interface2 {
              //實現接口后,默認方法名相同,必須復寫默認方法
              @Override
              public void defaultMethod() {
                  //接口的
                  JDK8Interface1.super.defaultMethod();
                  System.out.println("實現類復寫重名默認方法?。。?!");
              }
          }
      package com.study.demo.jdk8;
      
      public interface JDK8Interface1 {
      
          //1.接口中可以定義靜態方法了
          public static void staticMethod(){
              System.out.println("接口中的靜態方法");
          }
          
          //2.使用default之后就可以定義普通方法的方法體了
          public default void defaultMethod(){
              System.out.println("接口中的默認方法");
          }
      }
      package com.study.demo.jdk8;
      
      public interface JDK8Interface2 {
      
          //接口中可以定義靜態方法了
          public static void staticMethod(){
              System.out.println("接口中的靜態方法");
          }
          //使用default之后就可以定義普通方法的方法體了
          public default void defaultMethod(){
              System.out.println("接口中的默認方法");
          }
      }

      輸出:

      接口中的靜態方法
      接口中的默認方法
      接口中的默認方法
      實現類復寫重名默認方法?。。?!

      4.方法引用,與Lambda表達式聯合使用

       /**
           * 4.方法引用,與Lambda表達式聯合使用
           */
          @Test
          public void testMethodReference(){
              //構造器引用。語法是Class::new,或者更一般的Class< T >::new,要求構造器方法是沒有參數;
              final Car car = Car.create( Car::new );
              final List< Car > cars = Arrays.asList( car );
              //靜態方法引用。語法是Class::static_method,要求接受一個Class類型的參數;
              cars.forEach( Car::collide );
              //任意對象的方法引用。它的語法是Class::method。無參,所有元素調用;
              cars.forEach( Car::repair );
              //特定對象的方法引用,它的語法是instance::method。有參,在某個對象上調用方法,將列表元素作為參數傳入;
              final Car police = Car.create( Car::new );
              cars.forEach( police::follow );
          }
          
          public static class Car {
              public static Car create( final Supplier< Car > supplier ) {
                  return supplier.get();
              }              
                   
              public static void collide( final Car car ) {
                  System.out.println( "靜態方法引用 " + car.toString() );
              }
                   
              public void repair() {   
                  System.out.println( "任意對象的方法引用 " + this.toString() );
              }
              
              public void follow( final Car car ) {
                  System.out.println( "特定對象的方法引用 " + car.toString() );
              }
          }

      輸出:

      靜態方法引用 com.study.demo.jdk8.JDK8_features$Car@15615099
      任意對象的方法引用 com.study.demo.jdk8.JDK8_features$Car@15615099
      特定對象的方法引用 com.study.demo.jdk8.JDK8_features$Car@15615099

      5.引入重復注解

      /**
           * 5.引入重復注解
           * 1.@Repeatable 
           * 2.可以不用以前的“注解容器”寫法,直接寫2次相同注解即可
           * 
           * Java 8在編譯器層做了優化,相同注解會以集合的方式保存,因此底層的原理并沒有變化。
           */
          @Test
          public void RepeatingAnnotations(){
              RepeatingAnnotations.main(null);
          }
      package com.study.demo.jdk8;
      
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Repeatable;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      
      /**
       * 
       * @Description: 重復注解@Repeatable
       * @author lgs
       * @date 2020年4月9日
       *
       */
      public class RepeatingAnnotations {
          @Target( ElementType.TYPE )
          @Retention( RetentionPolicy.RUNTIME )
          public @interface Filters {
              Filter[] value();
          }
           
          @Target( ElementType.TYPE )
          @Retention( RetentionPolicy.RUNTIME )
          @Repeatable( Filters.class )
          public @interface Filter {
              String value();
              String value2();
          };
           
          @Filter( value="filter1",value2="111" )
          @Filter( value="filter2", value2="222")
          //@Filters({@Filter(  value="filter1",value2="111" ),@Filter(  value="filter2", value2="222")}).注意:JDK8之前:1.沒有@Repeatable2.采用本行“注解容器”寫法
          public interface Filterable {        
          }
               
          public static void main(String[] args) {
              //獲取注解后遍歷打印值
              for( Filter filter: Filterable.class.getAnnotationsByType( Filter.class ) ) {
                  System.out.println( filter.value() +filter.value2());
              }
          }
      }

      輸出:

      filter1111
      filter2222

      6.類型注解

      /**
           * 6.類型注解
           * 新增類型注解:ElementType.TYPE_USE 和ElementType.TYPE_PARAMETER(在Target上)
           * 
           */
          @Test
          public void ElementType(){
              Annotations.main(null);
          }
      package com.study.demo.jdk8;
      
      import java.lang.annotation.ElementType;
      import java.lang.annotation.Retention;
      import java.lang.annotation.RetentionPolicy;
      import java.lang.annotation.Target;
      import java.util.ArrayList;
      import java.util.Collection;
      
      /**
       * 
       * @Description: 新增類型注解:ElementType.TYPE_USE
       *               和ElementType.TYPE_PARAMETER(在Target上)
       * @author lgs
       * @date 2020年4月9日
       *
       */
      public class Annotations {
          @Retention( RetentionPolicy.RUNTIME )
          @Target( { ElementType.TYPE_USE, ElementType.TYPE_PARAMETER } )
          public @interface NonEmpty {        
          }
               
          public static class Holder< @NonEmpty T > extends @NonEmpty Object {
              public void method() throws @NonEmpty Exception {           
              }
          }
               
          public static void main(String[] args) {
              final Holder< String > holder = new @NonEmpty Holder< String >();       
              @NonEmpty Collection< @NonEmpty String > strings = new ArrayList<>();       
          }
      }

      輸出:

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

      /**
           * 7.最新的Date/Time API (JSR 310)
           */
          @Test
          public void DateTime(){
              //1.Clock
              final Clock clock = Clock.systemUTC();
              System.out.println("Clock:" + clock.instant() );
              System.out.println("Clock:" + clock.millis() );
              
              //2. ISO-8601格式且無時區信息的日期部分
              final LocalDate date = LocalDate.now();
              final LocalDate dateFromClock = LocalDate.now( clock );
                       
              System.out.println("ISO-8601格式且無時區信息的日期部分:" + date );
              System.out.println("ISO-8601格式且無時區信息的日期部分:" + dateFromClock );
                       
              // ISO-8601格式且無時區信息的時間部分
              final LocalTime time = LocalTime.now();
              final LocalTime timeFromClock = LocalTime.now( clock );
                       
              System.out.println("ISO-8601格式且無時區信息的時間部分:" + time );
              System.out.println("ISO-8601格式且無時區信息的時間部分:" + timeFromClock );
              
              // 3.ISO-8601格式無時區信息的日期與時間
              final LocalDateTime datetime = LocalDateTime.now();
              final LocalDateTime datetimeFromClock = LocalDateTime.now( clock );
                       
              System.out.println("ISO-8601格式無時區信息的日期與時間:" + datetime );
              System.out.println("ISO-8601格式無時區信息的日期與時間:" + datetimeFromClock );
              
              // 4.特定時區的日期/時間,
              final ZonedDateTime zonedDatetime = ZonedDateTime.now();
              final ZonedDateTime zonedDatetimeFromClock = ZonedDateTime.now( clock );
              final ZonedDateTime zonedDatetimeFromZone = ZonedDateTime.now( ZoneId.of( "America/Los_Angeles" ) );
                       
              System.out.println("特定時區的日期/時間:" + zonedDatetime );
              System.out.println("特定時區的日期/時間:" + zonedDatetimeFromClock );
              System.out.println("特定時區的日期/時間:" + zonedDatetimeFromZone );
              
              //5.在秒與納秒級別上的一段時間
              final LocalDateTime from = LocalDateTime.of( 2014, Month.APRIL, 16, 0, 0, 0 );
              final LocalDateTime to = LocalDateTime.of( 2015, Month.APRIL, 16, 23, 59, 59 );
               
              final Duration duration = Duration.between( from, to );
              System.out.println( "Duration in days: " + duration.toDays() );
              System.out.println( "Duration in hours: " + duration.toHours() );
          }

      輸出:

      Clock:2020-04-09T14:53:29.832Z
      Clock:1586444010096
      ISO-8601格式且無時區信息的日期部分:2020-04-09
      ISO-8601格式且無時區信息的日期部分:2020-04-09
      ISO-8601格式且無時區信息的時間部分:22:53:30.134
      ISO-8601格式且無時區信息的時間部分:14:53:30.134
      ISO-8601格式無時區信息的日期與時間:2020-04-09T22:53:30.134
      ISO-8601格式無時區信息的日期與時間:2020-04-09T14:53:30.134
      特定時區的日期/時間:2020-04-09T22:53:30.135+08:00[Asia/Shanghai]
      特定時區的日期/時間:2020-04-09T14:53:30.136Z
      特定時區的日期/時間:2020-04-09T07:53:30.148-07:00[America/Los_Angeles]
      Duration in days: 365
      Duration in hours: 8783

      8.新增base64加解密API

      /**
           * 8.新增base64加解密API
           */
          @Test
          public void testBase64(){
              final String text = "就是要測試加解密??!abjdkhdkuasu!!@@@@";
              String encoded = Base64.getEncoder()
                  .encodeToString( text.getBytes( StandardCharsets.UTF_8 ) );
              System.out.println("加密后="+ encoded );
               
              final String decoded = new String( 
                  Base64.getDecoder().decode( encoded ),
                  StandardCharsets.UTF_8 );
              System.out.println( "解密后="+decoded );
          }

      輸出:

      加密后=5bCx5piv6KaB5rWL6K+V5Yqg6Kej5a+G77yB77yBYWJqZGtoZGt1YXN1ISFAQEBA
      解密后=就是要測試加解密??!abjdkhdkuasu!!@@@@

      9.數組并行(parallel)操作

       /**
           * 9.數組并行(parallel)操作
           */
          @Test
          public void testParallel(){
              long[] arrayOfLong = new long [ 20000 ];        
              //1.給數組隨機賦值
              Arrays.parallelSetAll( arrayOfLong, 
                  index -> ThreadLocalRandom.current().nextInt( 1000000 ) );
              //2.打印出前10個元素
              Arrays.stream( arrayOfLong ).limit( 10 ).forEach( 
                  i -> System.out.print( i + " " ) );
              System.out.println();
              //3.數組排序
              Arrays.parallelSort( arrayOfLong );     
              //4.打印排序后的前10個元素
              Arrays.stream( arrayOfLong ).limit( 10 ).forEach( 
                  i -> System.out.print( i + " " ) );
              System.out.println();
          }

      輸出:

      595497 613578 610272 345452 269776 540298 900905 710734 751091 417846
      18 51 101 157 178 258 296 388 394 453

      10.JVM的PermGen(永久代)空間被移除,取代它的是Metaspace(JEP 122)元空間

      元空間參數設置:

      -XX:MetaspaceSize初始空間大小,達到該值就會觸發垃圾收集進行類型卸載,同時GC會對該值進行調整
      -XX:MaxMetaspaceSize最大空間,默認是沒有限制
      -XX:MinMetaspaceFreeRatio在GC之后,最小的Metaspace剩余空間容量的百分比,減少為分配空間所導致的垃圾收集
      -XX:MaxMetaspaceFreeRatio在GC之后,最大的Metaspace剩余空間容量的百分比,減少為釋放空間所導致的垃圾收集

       

      posted @ 2020-11-09 00:38  小不點啊  閱讀(265)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 国产免费播放一区二区三区| 久久一夜天堂av一区二区| 国产精选一区二区三区| 亚洲综合在线日韩av| 久久精品熟妇丰满人妻久久| 国产精品三级爽片免费看| 亚洲真人无码永久在线| 襄汾县| 四虎国产精品免费久久| 日韩黄色av一区二区三区| 国产日产免费高清欧美一区| 中国国产免费毛卡片| 免费费很色大片欧一二区| 爆乳2把你榨干哦ova在线观看| 日本国产精品第一页久久| 国产黑色丝袜在线播放| 酒店大战丝袜高跟鞋人妻| 日韩精品不卡一区二区三区| 中文国产不卡一区二区| 特黄aaaaaaa片免费视频| 久久AV中文综合一区二区| 久久精品国产国产精品四凭| a级国产乱理伦片在线观看al| 毛片网站在线观看| 久久99国产精一区二区三区!| 国产精品中文第一字幕| 国产欧美va欧美va在线| 色呦呦 国产精品| 国产av无码专区亚洲av软件| 免费人成年激情视频在线观看| 最新国产精品拍自在线播放| 国产91精品调教在线播放 | 日韩精品一区二区三区四| 国产乱理伦片在线观看| 日韩一区二区三在线观看| 亚洲中文字幕日产无码成人片| 国产AV影片麻豆精品传媒| 国产精品国产三级国av| 亚洲精品天堂成人片AV在线播放| 精品婷婷色一区二区三区| 啦啦啦视频在线日韩精品|