溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Java語言JDK1.8新特性有哪些

發(fā)布時(shí)間:2021-11-24 15:49:51 來源:億速云 閱讀:353 作者:iii 欄目:大數(shù)據(jù)

本篇內(nèi)容主要講解“Java語言JDK1.8新特性有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Java語言JDK1.8新特性有哪些”吧!

(1)Lambda表達(dá)式
    將函數(shù)當(dāng)成參數(shù)傳遞給某個(gè)方法,或者把代碼本身當(dāng)作數(shù)據(jù)處理。
    
    List<String> list = Arrays.asList("c", "a", "b");
    list.sort((e1, e2)->e1.compareTo(e2));

(2)接口的默認(rèn)方法、靜態(tài)方法和函數(shù)式接口
    函數(shù)接口指的是只有一個(gè)函數(shù)的接口,這樣的接口可以隱式轉(zhuǎn)換為Lambda表達(dá)式。
    默認(rèn)方法和靜態(tài)方法不會(huì)破壞函數(shù)式接口的定義。

    @FunctionalInterface
    public interface IMyFunTest {
        void testFun();
        
        default String getZxwStr(){
            return "zxw";
        }
        
        static void printZxwStr(){
            System.out.println("zxw");
        }
    }

(3)方法引用
    方法引用和Lambda表達(dá)式配合使用,使得java類的構(gòu)造方法看起來緊湊而簡潔。

    public class Test {
        public static void main(String[] args) throws Exception {
            Test test = Test.create(Test::new);
            List<Test> list = Arrays.asList(test);
            list.forEach(Test::staticMethod);
            list.forEach(Test::noParamMethod);
            list.forEach(new Test()::instanceMethod);
        }
        //構(gòu)造器引用,語法是Class::new
        public static Test create(Supplier<Test> supplier){
            return supplier.get();
        }
        //靜態(tài)方法引用,語法是Class::static_method
        public static void staticMethod(Test test){
            System.out.println(test.toString());
        }
        //類的成員方法的引用,語法是Class::method,注意,這個(gè)方法沒有定義入?yún)?br/>         public void noParamMethod(){
            System.out.println(this.toString());
        }
        //實(shí)例對象的成員方法的引用,語法是instance::method
        public void instanceMethod(Test test){
            System.out.println(test.toString());
            System.out.println(this.toString());
        }
    }

    // 普通應(yīng)用場景
    List<String> list = Arrays.asList("a", "c", "b");
    list.sort(String::compareTo);
    list.forEach(System.out::println); //a b c

(4)重復(fù)注解
    不是語言層面的改進(jìn),而是編譯器做的一個(gè)trick,底層的技術(shù)仍然相同。

    @Repeatable(Persons.class)
    public @interface Person{
        String role() default "";
    }
    @Target(ElementType.TYPE)  
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Persons {
        Person[] value();
    }
    @Person(role="father")
    @Person(role="son")
    public class Man {
        String name="";
    }
    
    public static void main(String[] args) throws Exception {
        for(Person t : Man.class.getAnnotationsByType(Person.class)){
            System.out.println(t.role());
        }
    }
(5)拓寬注解的應(yīng)用場景
    注解幾乎可以使用在任何元素上:局部變量、接口類型、超類和接口實(shí)現(xiàn)類,甚至可以用在函數(shù)的異常定義上。

(6)更好的類型推斷
    List<String> list = new ArrayList<>();
    list.add("a");
    list.addAll(new ArrayList<>()); // JDK1.81之前編譯不過

(7)Optional
    of:         把指定的值封裝為Optional對象,如果指定的值為null,則拋出NullPointerException
    empty:      創(chuàng)建一個(gè)空的Optional對象
    ofNullable: 把指定的值封裝為Optional對象,如果指定的值為null,則創(chuàng)建一個(gè)空的Optional對象
    get:        如果創(chuàng)建的Optional中有值存在,則返回此值,否則拋出NoSuchElementException
    orElse:     如果創(chuàng)建的Optional中有值存在,則返回此值,否則返回一個(gè)默認(rèn)值
    orElseGet:  如果創(chuàng)建的Optional中有值存在,則返回此值,否則返回一個(gè)由Supplier接口生成的值
    orElseThrow:如果創(chuàng)建的Optional中有值存在,則返回此值,否則拋出一個(gè)由指定的Supplier接口生成的異常
    filter:     如果創(chuàng)建的Optional中的值滿足filter中的條件,則返回包含該值的Optional對象,否則返回一個(gè)空的Optional對象
    map:        如果創(chuàng)建的Optional中的值存在,對該值執(zhí)行提供的Function函數(shù)調(diào)用
    flagMap:    如果創(chuàng)建的Optional中的值存在,就對該值執(zhí)行提供的Function函數(shù)調(diào)用,返回一個(gè)Optional類型的值,
                     否則就返回一個(gè)空的Optional對象
    isPresent:  如果創(chuàng)建的Optional中的值存在,返回true,否則返回false
    ifPresent:  如果創(chuàng)建的Optional中的值存在,則執(zhí)行該方法的調(diào)用,否則什么也不做

(8)Streams
    將生成環(huán)境的函數(shù)式編程引入了Java庫中?!鞠鄬?fù)雜】

    List<String> list = new ArrayList<>();
    list.addAll(Arrays.asList("a", "b", "c"));
    list.stream().filter(e->!e.equals("b")).forEach(System.out::println);

    List<String> strList = Arrays.asList("a,b,cc,b,b,cc".split(","));
    Map<String, Long> sortMap = strList.stream().collect(Collectors.groupingBy(t -> t, Collectors.counting()));
    sortMap.forEach((key, value) -> System.out.println(key + "->" + value));

(9)Date/Time API
    新的時(shí)間和日期管理API深受Joda-Time影響,并吸收了很多Joda-Time的精華。
    java.util.time.*

(10)并行數(shù)組
    可以顯著加快多核機(jī)器上的數(shù)組排序。

    long[] arrayOfLong = new long [ 20000 ];        
    Arrays.parallelSetAll( arrayOfLong, index -> ThreadLocalRandom.current().nextInt( 1000000 ) );
    Arrays.stream( arrayOfLong ).limit(10).forEach( i -> System.out.print( i+" " ) );
    System.out.println();
    Arrays.parallelSort( arrayOfLong );        
    Arrays.stream( arrayOfLong ).limit(10).forEach( i -> System.out.print( i+" " ) );

(11)Base64編碼支持
    java.util.Base64

(12)并發(fā)性
    java.util.concurrent 包下增加了很多新的類和方法。

(13)Nashorn JavaScript引擎
    ScriptEngineManager manager = new ScriptEngineManager();
    ScriptEngine engine = manager.getEngineByName("JavaScript");
    System.out.println(engine.eval( "function f() { return 1; }; f() + 1;") ); // 2.0

(14)參數(shù)名稱
    在語言層面(使用反射API和Parameter.getName())和字節(jié)碼層面(使用新的 -parameters 參數(shù))提供支持。

    Maven項(xiàng)目配置:
    <configuration>
            <compilerArgument>-parameters</compilerArgument>

到此,相信大家對“Java語言JDK1.8新特性有哪些”有了更深的了解,不妨來實(shí)際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI