1. 程式人生 > >Java8基礎知識點梳理

Java8基礎知識點梳理

最近可能是自己的原因導致對Java8的學習落入的下乘,我們就來抽個時間將Java8的知識點進行梳理下吧

常用的函式(函式式介面)

  • 1.function

    根據我的記憶是function裡面有個apply方法,apply方法是接受一個引數,並不返回值,我們去看下原始碼

    那麼就比較明顯了,我記錯了,在我看來這個是一個好事,下面我們去寫個程式碼去測試一下這個方法


import java.util.function.Function;

/**
 * @author Zerox
 * @date 2018/11/30 8:58
 *
 * 目的:測試Functinon裡面apply函式的作用
 *
 * 該apply(T t)方法給出的註釋是將給定的引數應用到這個函式中
 * 通俗的來將就是傳參,不過這個引數傳遞的是一個方法
 */
public class TestFunction { public static void main(String[] args) { int length = TestFunction("hello",stringValue -> stringValue.length()); System.out.println(length); } /** * * @param strValue 輸入的引數 * @param function 呼叫apply方法 * @return */
public static int TestFunction(String strValue ,Function<String,Integer> function) { return function.apply(strValue); } }

函式的執行結果是:

  • 2.supplier函式

先說下自己的感受吧,首先咋一開始的時候,我對這個方法是毫無波動的,為什麼呢?可能理解的比較淺吧,現在我的內心也是毫無波動的,只是認為單純的生成一個物件根據所提供的泛型,唯一的聯想是可能這個東西類似於工廠模式吧,接著我們去看下原始碼

這個方法看來我並沒有記錯,我們去閱讀下這個方法到底什麼意思吧一句話"結果的集裝箱",返回一個新的或者"集裝箱裡面不存在的,我們測試下它說的意思"


import java.util.function.Supplier;

/**
 * @author Zerox
 * @date 2018/11/30 9:26
 */
public class TestSupplier {

    public static void main(String[] args) {

        /**
         * 所遇到的問題:
         *      1. 不會生成物件了 ---> 搞出來兩種實現方法
         *          a. Supplier<StudentEntity> supplier = StudentEntity::new; //第一種實現方法
         *          b. Supplier<StudentEntity> supplier = () -> new StudentEntity(); // 第二種實現方法
         *
         *          本質上屬於一種
         */
        Supplier<StudentEntity> supplier =StudentEntity::new; //第一種實現方法

        Supplier<StudentEntity> supplier1 =StudentEntity::new; //第一種實現方法

        // 判斷,我們上面所說的不存在的物件或者新生成的物件
        if (supplier == supplier1) { // 直接比較地址就好
            System.out.println("1");
        } else{
            System.out.println("0");
        }
        // 結果確實是不存在的,新的。
    }
}

函式的執行結果是:

-3.Consumer函式

如果,不出意外這個是我一開始,出意外的那個東西,不過,我思考錯了,這個就是那種接受引數不返回值那個,我們來看一下原始碼

這個方法就比較有意思了,有輸入無返回值,我都不知道他是幹嘛用的,我的理解是:它只能夠等同於System.out.println()這個輸出語句了


import java.util.ArrayList;
import java.util.List;
import java.util.function.Consumer;
import java.util.stream.Stream;

/**
 * @author Zerox
 * @date 2018/11/30 10:47
 */
public class TestConsumer {

    public static void main(String[] args) {
        

        List<StudentEntity> list = new ArrayList<>();

        Consumer<StudentEntity> consumer = x -> {

            list.add(x);
        };

        StudentEntity studentEntity = new StudentEntity(15,"zhangsan");
        StudentEntity studentEntity1 = new StudentEntity(16,"lisi");
        StudentEntity studentEntity2 = new StudentEntity(17,"wangwu");
        StudentEntity studentEntity3 = new StudentEntity(18,"zhaoliu");

        Stream.of(studentEntity,studentEntity1,studentEntity2,studentEntity3).forEach(consumer);

        list.stream().forEach(System.out::println);
    }

    /**
     *
     * @param stringValue 待操作的值
     * @param consumer 操作函式
     *
     *                 像我這樣寫是毫無意義的,才去百度了一下大神的簡書  https://www.jianshu.com/p/0b955173045e
     */
    public static void testConsumer(String stringValue,Consumer<String> consumer) {

        consumer.accept(stringValue);
    }

}

-3.BiFunction函式

這個函式可以說是Function函式的拓展吧,function函式appy()方法接受一個引數,返回一個引數,而Bifunction是接收兩個引數,返回一個引數,下面我們來看下原始碼

我能想到的就是兩個數字的操作,下面我們來看程式碼吧


import java.util.function.BiFunction;

/**
 * @author Zerox
 * @date 2018/11/30 13:11
 */
public class TestBiFunction {

    public static void main(String[] args) {

        System.out.println(TestBiFunction(3,4,(i,j) -> i + j));
        System.out.println(TestBiFunction(3,4,(i,j) -> i - j));
        System.out.println(TestBiFunction(3,4,(i,j) -> i * j));
        System.out.println(TestBiFunction(3,4,(i,j) -> i / j));

    }
    /**
     *
     * @param i 待操作的數字1
     * @param j 待操作的數字2
     * @param biFunction 即將呼叫的函式式介面
     * @return 傳入的函式
     */
    public static int TestBiFunction(int i,int j,BiFunction<Integer,Integer,Integer> biFunction) {

        return biFunction.apply(i,j);
    }
}

函式的執行結果是:

-4.Predicate函式

predicate函式這個函式比較有意思,在我的認知裡面就是"判別式"這樣子說,感覺不太好懂,換個說法就是你去試鞋子,你的腳需要把鞋子穿進去,那麼這個鞋子的號碼就是條件,下面我們來看下原始碼

給定一個引數判斷為true或者false


import java.util.function.Predicate;

/**
 * @author Zerox
 * @date 2018/11/30 13:44
 */
public class TestPredicate {

    public static void main(String[] args) {

        System.out.println(testPredicate("hello world",strvalue -> strvalue.equals("hello world")));
        System.out.println("******");
        System.out.println(testPredicate("hello world",strvalue -> strvalue.equals("hello world1")));

    }
    public static boolean testPredicate(String strvalue,Predicate predicate) {

       return  predicate.test(strvalue);
    }
}

函式的執行結果是:

-4.Optional類

這個類需要說一下,因為她很重要,防止空指標操作,下面我們看下原始碼

這個方法是判斷容器裡面的物件是否為空,如果為空會返回什麼呢?不為空又會怎樣?我們去測試下,下面我們去寫下測試程式碼

這個先不說了,需要拿出來單獨去說,這個方法比較麻煩

存在問題,請指出,不勝感激