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類
這個類需要說一下,因為她很重要,防止空指標操作,下面我們看下原始碼
這個方法是判斷容器裡面的物件是否為空,如果為空會返回什麼呢?不為空又會怎樣?我們去測試下,下面我們去寫下測試程式碼
這個先不說了,需要拿出來單獨去說,這個方法比較麻煩
存在問題,請指出,不勝感激