1. 程式人生 > >Java8基本特性

Java8基本特性


Stream:
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");
        Long count;
        List<String> filtered;
        List<Integer> squaresList;
        String mergedString;
        Random random = new Random();

        System.out.println("使用 Java 8: ");
        System.out.println("列表: " + strings);

        count = strings.stream().filter(string -> string.isEmpty()).count();
        System.out.println("空字串數量為: " + count);

        count = strings.stream().filter(string -> string.length() == 3).count();
        System.out.println("字串長度為 3 的數量為: " + count);

        filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList());
        System.out.println("篩選後的列表: " + filtered);

        mergedString = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.joining(","));
        System.out.println("合併字串: " + mergedString);

        List<Integer> integers = Arrays.asList(3, 2, 2, 3, 7, 3, 5);
        squaresList = integers.stream().map(i -> i * i).distinct().collect(Collectors.toList());
        System.out.println("Squares List: " + squaresList);
        System.out.println("列表: " + integers);

        IntSummaryStatistics stats = integers.stream().mapToInt((x) -> x).summaryStatistics();

        System.out.println("列表中最大的數 : " + stats.getMax());
        System.out.println("列表中最小的數 : " + stats.getMin());
        System.out.println("所有數之和 : " + stats.getSum());
        System.out.println("平均數 : " + stats.getAverage());
        System.out.println("隨機數: ");

        random.ints().limit(10).sorted().forEach(System.out::println);

        // 並行處理
        count = strings.parallelStream().filter(string -> string.isEmpty()).count();
        System.out.println("空字串的數量為: " + count);

        
        是否匹配任一元素:anyMatch
        anyMatch用於判斷流中是否存在至少一個元素滿足指定的條件,這個判斷條件通過Lambda表示式傳遞給anyMatch,執行結果為boolean型別。
        如,判斷list中是否有學生:
        boolean result = list.stream().anyMatch(Person::isStudent);            

        是否匹配所有元素:allMatch
        allMatch用於判斷流中的所有元素是否都滿足指定條件,這個判斷條件通過Lambda表示式傳遞給anyMatch,執行結果為boolean型別。
        如,判斷是否所有人都是學生:
        boolean result = list.stream()
                    .allMatch(Person::isStudent);            

        是否未匹配所有元素:noneMatch
        noneMatch與allMatch恰恰相反,它用於判斷流中的所有元素是否都不滿足指定條件:
        boolean result = list.stream()
                    .noneMatch(Person::isStudent);            

        獲取任一元素findAny
        findAny能夠從流中隨便選一個元素出來,它返回一個Optional型別的元素。
        Optional<Person> person = list.stream().findAny();
        
        
        
        
Optional類:    
    https://blog.csdn.net/u014604691/article/details/51956780        
    
    of: 
        為非null的值建立一個Optional。
        of方法通過工廠方法建立Optional類。需要注意的是,建立物件時傳入的引數不能為null。如果傳入引數為null,則丟擲NullPointerException 。
        //呼叫工廠方法建立Optional例項
        Optional<String> name = Optional.of("Sanaulla");
        //傳入引數為null,丟擲NullPointerException.
        Optional<String> someNull = Optional.of(null);

    ofNullable: 
        為指定的值建立一個Optional,如果指定的值為null,則返回一個空的Optional。
        ofNullable與of方法相似,唯一的區別是可以接受引數為null的情況。示例如下:

        //下面建立了一個不包含任何值的Optional例項
        //例如,值為'null'
        Optional empty = Optional.ofNullable(null);

    ifPresent: 
        如果Optional例項有值則為其呼叫consumer,否則不做處理
        如果Optional例項有值,呼叫ifPresent()可以接受介面段或lambda表示式。類似下面的程式碼:

        //ifPresent方法接受lambda表示式作為引數。
        //lambda表示式對Optional的值呼叫consumer進行處理。
        name.ifPresent((value) -> {
          System.out.println("The length of the value is: " + value.length());
        });
    
    orElse: 
        如果有值則將其返回,否則返回指定的其它值。
        如果Optional例項有值則將其返回,否則返回orElse方法傳入的引數。示例如下:
            //如果值不為null,orElse方法返回Optional例項的值。
            //如果為null,返回傳入的訊息。
            //輸出:There is no value present!
            System.out.println(empty.orElse("There is no value present!"));
            //輸出:Sanaulla
            System.out.println(name.orElse("There is some value!"));

    orElseGet:
        orElseGet與orElse方法類似,區別在於得到的預設值。orElse方法將傳入的字串作為預設值,orElseGet方法可以接受Supplier介面的實現用來生成預設值。示例如下:
            //orElseGet與orElse方法類似,區別在於orElse傳入的是預設值,
            //orElseGet可以接受一個lambda表示式生成預設值。
            //輸出:Default Value
            System.out.println(empty.orElseGet(() -> "Default Value"));
            //輸出:Sanaulla
            System.out.println(name.orElseGet(() -> "Default Value"));

    map: 如果有值,則對其執行呼叫mapping函式得到返回值。如果返回值不為null,則建立包含mapping返回值的Optional作為map方法返回值,否則返回空Optional。
        map方法示例如下:
            //map方法執行傳入的lambda表示式引數對Optional例項的值進行修改。
            //為lambda表示式的返回值建立新的Optional例項作為map方法的返回值。
            Optional<String> upperName = name.map((value) -> value.toUpperCase());
            System.out.println(upperName.orElse("No value found"));

    flatMap:
        如果有值,為其執行mapping函式返回Optional型別返回值,否則返回空Optional。flatMap與map(Funtion)方法類似,區別在於flatMap中的mapper返回值必須是Optional。呼叫結束時,flatMap不會對結果用Optional封裝。
        flatMap方法與map方法類似,區別在於mapping函式的返回值不同。map方法的mapping函式返回值可以是任何型別T,而flatMap方法的mapping函式必須是Optional。
        參照map函式,使用flatMap重寫的示例如下:
            //flatMap與map(Function)非常類似,區別在於傳入方法的lambda表示式的返回型別。
            //map方法中的lambda表示式返回值可以是任意型別,在map函式返回之前會包裝為Optional。 
            //但flatMap方法中的lambda表示式返回值必須是Optionl例項。 
            upperName = name.flatMap((value) -> Optional.of(value.toUpperCase()));
            System.out.println(upperName.orElse("No value found"));//輸出SANAULLA

    filter:
        如果有值並且滿足斷言條件返回包含該值的Optional,否則返回空Optional。
        下面的示例介紹了滿足限定條件和不滿足兩種情況:
            //filter方法檢查給定的Option值是否滿足某些條件。
            //如果滿足則返回同一個Option例項,否則返回空Optional。
            Optional<String> longName = name.filter((value) -> value.length() > 6);
            System.out.println(longName.orElse("The name is less than 6 characters"));//輸出Sanaulla

            //另一個例子是Optional值不滿足filter指定的條件。
            Optional<String> anotherName = Optional.of("Sana");
            Optional<String> shortName = anotherName.filter((value) -> value.length() > 6);
            //輸出:name長度不足6字元
            System.out.println(shortName.orElse("The name is less than 6 characters"));