java之函數(shù)式接口解讀
一、函數(shù)式接口
概念
函數(shù)式接口在Java中是指:有且僅有一個(gè)抽象方法的接口。 當(dāng)然接口中可以包含其他的方法(默認(rèn),靜態(tài),私有)
函數(shù)式接口,即適用于函數(shù)式編程場(chǎng)景的接口。而Java中的函數(shù)式編程體現(xiàn)就是Lambda,所以函數(shù)式接口就是可
以適用于Lambda使用的接口。只有確保接口中有且僅有一個(gè)抽象方法,Java中的Lambda才能順利地進(jìn)行推導(dǎo)。
備注:“語(yǔ)法糖”是指使用更加方便,但是原理不變的代碼語(yǔ)法。例如在遍歷集合時(shí)使用的for-each語(yǔ)法,其實(shí)底層的實(shí)現(xiàn)原理仍然是迭代器,這便是“語(yǔ)法糖”。從應(yīng)用層面來(lái)講,Java中的Lambda可以被當(dāng)做是匿名內(nèi)部類(lèi)的“語(yǔ)法糖”,但是二者在原理上是不同的。
格式
只要確保接口中有且僅有一個(gè)抽象方法即可:
修飾符 interface 接口名稱(chēng) {
public abstract 返回值類(lèi)型 方法名稱(chēng)(可選參數(shù)信息);
// 其他非抽象方法內(nèi)容
}@FunctionalInterface注解
與 @Override 注解的作用類(lèi)似,Java 8中專(zhuān)門(mén)為函數(shù)式接口引入了一個(gè)新的注解: @FunctionalInterface 。該注
解可用于一個(gè)接口的定義上:
- 一旦使用該注解來(lái)定義接口,編譯器將會(huì)強(qiáng)制檢查該接口是否確實(shí)有且僅有一個(gè)抽象方法,否則將會(huì)報(bào)錯(cuò)。需要注
- 意的是,即使不使用該注解,只要滿(mǎn)足函數(shù)式接口的定義,這仍然是一個(gè)函數(shù)式接口,使用起來(lái)都一樣。
作用:可以檢測(cè)接口是否是一個(gè)函數(shù)式接口
- 是:編譯成功 否:編譯失敗(接口中沒(méi)有抽象方法或者抽象方法的個(gè)數(shù)多于一個(gè))
- 函數(shù)式接口的使用:一般作為方法的參數(shù)和返回值類(lèi)型
當(dāng)參數(shù)是一個(gè)接口時(shí),我們可以采用下面三種方法來(lái)進(jìn)行操作

性能浪費(fèi)的日志案例
注:日志可以幫助我們快速的定位問(wèn)題,記錄程序運(yùn)行過(guò)程中的情況,以便項(xiàng)目的監(jiān)控和優(yōu)化。
一種典型的場(chǎng)景就是對(duì)參數(shù)進(jìn)行有條件使用,例如對(duì)日志消息進(jìn)行拼接后,在滿(mǎn)足條件的情況下進(jìn)行打印輸出:

發(fā)現(xiàn)以下代碼存在的一些性能浪費(fèi)的問(wèn)題:
調(diào)用showLog方法,傳遞的第二個(gè)參數(shù)是一個(gè)拼接后的字符串,先把字符串拼接好,然后在調(diào)用showlog方法,showLog方法中如果傳遞的日志等級(jí)不是1級(jí),那么就不會(huì)是如此拼接后的字符串,所以感覺(jué)字符串就白拼接了,存在了浪費(fèi).
使用Lambda優(yōu)化日志案例
Lambda的特點(diǎn):延遲加載
Lambda的使用前提,必須存在函數(shù)式接口
使用Lambda必然需要一個(gè)函數(shù)式接口:
然后對(duì) log 方法進(jìn)行改造:
@FunctionalInterface
public interface MessageBuilder {
String buildMessage();
}
對(duì) log 方法進(jìn)行改造:
public class Demo02LoggerLambda {
private static void log(int level, MessageBuilder builder) {
if (level == 1) {
System.out.println(builder.buildMessage());
}
}
public static void main(String[] args) {
String msgA = "Hello";
String msgB = "World";
String msgC = "Java";
log(1, () ‐> msgA + msgB + msgC );
}
}
這樣一來(lái),只有當(dāng)級(jí)別滿(mǎn)足要求的時(shí)候,才會(huì)進(jìn)行三個(gè)字符串的拼接;否則三個(gè)字符串將不會(huì)進(jìn)行拼接。
- 使用Lambda表達(dá)式作為參數(shù)傳遞,僅僅是把參數(shù)傳遞到showLog方法中。
- 只有滿(mǎn)足條件,日志的等級(jí)是1級(jí),才會(huì)調(diào)用接口MessageBuilder中的方法builderMessage,才會(huì)進(jìn)行字符串的拼接。如果條件不滿(mǎn)足,日志的等級(jí)不是1級(jí)
- 那么MessageBuilder接口中的方法builderMessage也不會(huì)執(zhí)行
- 所以拼接字符串的代碼也不會(huì)執(zhí)行
- 所以不會(huì)存在性能的浪費(fèi)
使用Lambda作為參數(shù)和返回值
如果拋開(kāi)實(shí)現(xiàn)原理不說(shuō),Java中的Lambda表達(dá)式可以被當(dāng)作是匿名內(nèi)部類(lèi)的替代品。如果方法的參數(shù)是一個(gè)函數(shù) 式接口類(lèi)型,那么就可以使用Lambda表達(dá)式進(jìn)行替代。
使用Lambda表達(dá)式作為方法參數(shù),其實(shí)就是使用函數(shù)式 接口作為方法參數(shù)。
例如 java.lang.Runnable 接口就是一個(gè)函數(shù)式接口,假設(shè)有一個(gè) startThread 方法使用該接口作為參數(shù),那么就 可以使用Lambda進(jìn)行傳參。
這種情況其實(shí)和 Thread 類(lèi)的構(gòu)造方法參數(shù)為 Runnable 沒(méi)有本質(zhì)區(qū)別。
public class Demo04Runnable {
private static void startThread(Runnable task) {
new Thread(task).start(); }
public static void main(String[] args) {
startThread(() ‐> System.out.println("線程任務(wù)執(zhí)行!"));
}
}
Lambda表達(dá)式作為參數(shù)傳遞
使用前提:方法的參數(shù)必須時(shí)函數(shù)式接口(是接口且接口中有且只有一個(gè)抽象方法)

Lambda表達(dá)式作為返回值
如果一個(gè)方法的返回值類(lèi)型是一個(gè)函數(shù)式接口,那么就可以直接返回一個(gè)Lambda表達(dá)式。
當(dāng)需要通過(guò)一 個(gè)方法來(lái)獲取一個(gè) java.util.Comparator 接口類(lèi)型的對(duì)象作為排序器時(shí),就可以調(diào)該方法獲取。
package com.itheima.demo01.Lambda;
import java.util.Arrays;
import java.util.Comparator;
public class Demo01 {
//定義一個(gè)方法,方法的返回值類(lèi)型使用函數(shù)式接口Comparator
public static Comparator<String> getComparator(){
//方法的返回值類(lèi)型是一個(gè)接口,那么我們可以返回這個(gè)接口的匿名內(nèi)部類(lèi)
/* return new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//按照字符串的降序排序
return o2.length()-o1.length();
}
};*/
//使用lambda表達(dá)式進(jìn)行優(yōu)化
return ( o1, o2)-> o2.length()-o1.length();
}
public static void main(String[] args) {
String[] arr={"aaaa","nnnnnnn","oooooooo"};
System.out.println("排序前:");
System.out.println(Arrays.toString(arr));
System.out.println("排序后:");
Arrays.sort(arr,getComparator());
System.out.println(Arrays.toString(arr));
}
}
二、常用函數(shù)式接口
JDK提供了大量常用的函數(shù)式接口以豐富Lambda的典型使用場(chǎng)景,它們主要在 java.util.function 包中被提供。
下面是最簡(jiǎn)單的幾個(gè)接口及使用示例。
Supplier接口
java.util.function.Supplier 接口僅包含一個(gè)無(wú)參的方法: T get() 。用來(lái)獲取一個(gè)泛型參數(shù)指定類(lèi)型的對(duì)象數(shù)據(jù)。由于這是一個(gè)函數(shù)式接口,這也就意味著對(duì)應(yīng)的Lambda表達(dá)式需要“對(duì)外提供”一個(gè)符合泛型類(lèi)型的對(duì)象數(shù)據(jù)。
Supplier接口被稱(chēng)之為生產(chǎn)型接口,指定接口的泛型是什么類(lèi)型,那么接口中的get方法就會(huì)生產(chǎn)什么類(lèi)型的數(shù)據(jù)

練習(xí):求數(shù)組元素最大值
題目
使用 Supplier 接口作為方法參數(shù)類(lèi)型,通過(guò)Lambda表達(dá)式求出int數(shù)組中的最大值。提示:接口的泛型請(qǐng)使用 java.lang.Integer 類(lèi)。
package com.itheima.demo01.Lambda;
import java.util.function.Supplier;
public class Demo02Test {
//定義一個(gè)方法,方法的參數(shù)傳遞Supplier,泛型使用Integer
public static Integer getMax(Supplier<Integer> sup){
return sup.get();
}
public static void main(String[] args) {
int[] arr={12,9,8,3,30};
//調(diào)用getMax方法,方法的參數(shù)Supplier是一個(gè)函數(shù)式接口,所以可以傳遞Lambda表達(dá)式
int maxValue=getMax(()->{
int max=arr[0];
for (int i = 0; i <arr.length ; i++) {
if (max<arr[i]){
max=arr[i];
}
}
return max;
});
System.out.println(maxValue);
}
}
Consumer接口
java.util.function.Consumer 接口則正好與Supplier接口相反,它不是生產(chǎn)一個(gè)數(shù)據(jù),而是消費(fèi)一個(gè)數(shù)據(jù)(至于具體怎么消費(fèi)(使用), 需要自定義(輸出,計(jì)算…) 其數(shù)據(jù)類(lèi)型由泛型決定。
抽象方法:accept
Consumer 接口中包含抽象方法 void accept(T t) ,意為消費(fèi)一個(gè)指定泛型的數(shù)據(jù)?;臼褂萌纾?/p>
package com.itheima.demo01.Lambda;
import java.util.function.Consumer;
public class Demo03Consumer {
/*定義一個(gè)方法
方法的參數(shù)傳遞一個(gè)字符串的姓名
方法的參數(shù)傳遞Consumer接口,泛型使用String
可以使用Consumer接口消費(fèi)字符串的姓名*/
public static void method(String name,Consumer<String> con){
con.accept(name);
}
public static void main(String[] args) {
//調(diào)用method方法,傳遞字符串姓名,方法的另一個(gè)參數(shù)是Consumer接口,是一個(gè)函數(shù)式接口,所以可以傳遞Lombda表達(dá)式
method("不放棄",(String name)->{
//1.最簡(jiǎn)單的消費(fèi),直接輸出
System.out.println(name);
//2.消費(fèi)方式:把字符串進(jìn)行翻轉(zhuǎn)輸出
//StringBuffer里面有個(gè)字符反轉(zhuǎn)的方法
String s=new StringBuffer(name).reverse().toString();
System.out.println(s);
});
}
}
默認(rèn)方法:andThen
如果一個(gè)方法的參數(shù)和返回值全都是 Consumer 類(lèi)型,那么就可以實(shí)現(xiàn)效果:消費(fèi)數(shù)據(jù)的時(shí)候,首先做一個(gè)操作,
然后再做一個(gè)操作,實(shí)現(xiàn)組合。而這個(gè)方法就是 Consumer 接口中的default方法 andThen 。

要想實(shí)現(xiàn)組合,需要兩個(gè)或多個(gè)Lambda表達(dá)式即可,而 andThen 的語(yǔ)義正是“一步接一步”操作。例如兩個(gè)步驟組
合的情況:
package com.itheima.demo01.Lambda;
import java.util.function.Consumer;
public class Demo04 {
///定義一個(gè)方法,方法的參數(shù)傳遞一個(gè)字符串和兩個(gè)Consumer接口, Consumer接口的泛型使用字符串
public static void method(String s, Consumer<String> con1,Consumer<String> con2){
// con1.accept(s);
//con2.accept(s);
con1.andThen(con2).accept(s);//con1連接con2,先執(zhí)行con1消費(fèi)數(shù)據(jù),再執(zhí)行con2消費(fèi)數(shù)據(jù)
}
public static void main(String[] args) {
method("BeiJing",
(s)->{
//消費(fèi)方式:將字符串變成小寫(xiě)
System.out.println(s.toLowerCase());
},
(s)->{
//消費(fèi)方式:將字符串變成大寫(xiě)
System.out.println(s.toUpperCase());
}
);
}
}
練習(xí):格式化打印信息
題目
下面的字符串?dāng)?shù)組當(dāng)中存有多條信息,請(qǐng)按照格式“ 姓名:XX。性別:XX。 ”的格式將信息打印出來(lái)。要求將打印姓
名的動(dòng)作作為第一個(gè) Consumer 接口的Lambda實(shí)例,將打印性別的動(dòng)作作為第二個(gè) Consumer 接口的Lambda實(shí)
例,將兩個(gè) Consumer 接口按照順序“拼接”到一起。
public static void main(String[] args) {
String[] array = { "迪麗熱巴,女", "古力娜扎,女", "馬爾扎哈,男" };
}
代碼演示:
package com.itheima.demo01.Lambda;
import java.util.function.Consumer;
public class Demo05Test {
public static void method(String[] arr, Consumer<String> con1,Consumer<String> con2){
//遍歷字符串?dāng)?shù)組
for (String s : arr) {
//使用andThen方法連接連個(gè)Consume接口,消費(fèi)字符串
con1.andThen(con2).accept(s);
}
}
public static void main(String[] args) {
String[] arr={"迪麗熱巴,女", "古力娜扎,女", "馬爾扎哈,男"};
method(arr,
(t)->{
//將字符串?dāng)?shù)據(jù)進(jìn)行切割
String name = t.split(",")[0];
//消費(fèi)一:打印出姓名:XXX
System.out.print("姓名:"+name);
},
(t)->{
//將字符串?dāng)?shù)據(jù)進(jìn)行切割
String age = t.split(",")[1];
//消費(fèi)二:打印出性別:XXX
System.out.println(","+"年齡:"+age+"。");
});
}
}

Predicate接口
有時(shí)候我們需要對(duì)某種類(lèi)型的數(shù)據(jù)進(jìn)行判斷,從而得到一個(gè)boolean值結(jié)果。這時(shí)可以使用
java.util.function.Predicate 接口。
抽象方法:test
Predicate 接口中包含一個(gè)抽象方法: boolean test(T t) 。用于條件判斷的場(chǎng)景:
import java.util.function.Predicate;
public class Demo15PredicateTest {
private static void method(Predicate<String> predicate) {
boolean veryLong = predicate.test("HelloWorld");
System.out.println("字符串很長(zhǎng)嗎:" + veryLong); }
public static void main(String[] args) {
method(s ‐> s.length() > 5);
}
}
條件判斷的標(biāo)準(zhǔn)是傳入的Lambda表達(dá)式邏輯,只要字符串長(zhǎng)度大于5則認(rèn)為很長(zhǎng)。
默認(rèn)方法:and
相當(dāng)于&&
既然是條件判斷,就會(huì)存在與、或、非三種常見(jiàn)的邏輯關(guān)系。其中將兩個(gè) Predicate 條件使用“與”邏輯連接起來(lái)實(shí)
現(xiàn)“并且”的效果時(shí),可以使用default方法 and 。
如果要判斷一個(gè)字符串既要包含大寫(xiě)“H”,又要包含大寫(xiě)“W”,那么:
import java.util.function.Predicate;
public class Demo16PredicateAnd {
private static void method(Predicate<String> one, Predicate<String> two) {
boolean isValid = one.and(two).test("Helloworld");
System.out.println("字符串符合要求嗎:" + isValid);
}
public static void main(String[] args) {
method(s ‐> s.contains("H"), s ‐> s.contains("W"));
}
}
默認(rèn)方法:or
與 and 的“與”類(lèi)似,默認(rèn)方法 or 實(shí)現(xiàn)邏輯關(guān)系中的“或”。
如果希望實(shí)現(xiàn)邏輯“字符串包含大寫(xiě)H或者包含大寫(xiě)W”,那么代碼只需要將“and”修改為“or”名稱(chēng)即可,其他都不變:
import java.util.function.Predicate;
public class Demo16PredicateAnd {
private static void method(Predicate<String> one, Predicate<String> two) {
boolean isValid = one.or(two).test("Helloworld");
System.out.println("字符串符合要求嗎:" + isValid);
}
public static void main(String[] args) {
method(s ‐> s.contains("H"), s ‐> s.contains("W"));
}
}
默認(rèn)方法:negate
“與”、“或”已經(jīng)了解了,剩下的“非”(取反)也會(huì)簡(jiǎn)單。
從實(shí)現(xiàn)中很容易看出,它是執(zhí)行了test方法之后,對(duì)結(jié)果boolean值進(jìn)行“!”取反而已。一定要在 test 方法調(diào)用之前
調(diào)用 negate 方法,正如 and 和 or 方法一樣:
import java.util.function.Predicate;
public class Demo17PredicateNegate {
private static void method(Predicate<String> predicate) {
boolean veryLong = predicate.negate().test("HelloWorld");
System.out.println("字符串很長(zhǎng)嗎:" + veryLong);
}
public static void main(String[] args) {
method(s ‐> s.length() < 5);
}
}
練習(xí):集合信息篩選
題目
數(shù)組當(dāng)中有多條“姓名+性別”的信息如下,請(qǐng)通過(guò) Predicate 接口的拼裝將符合要求的字符串篩選到集合
ArrayList 中,需要同時(shí)滿(mǎn)足兩個(gè)條件:
- 必須為女生;
- 姓名為4個(gè)字
代碼演示:
package com.itheima.demo01.Lambda;
import java.util.ArrayList;
import java.util.function.Predicate;
public class Demo06Test {
public static void main(String[] args) {
String [] arr={ "迪麗熱巴,女", "古力娜扎,女", "馬爾扎哈,男", "趙麗穎,女"};
ArrayList<String> arry= method(arr,
(t)->{
//切割字符串?dāng)?shù)組,判斷名字長(zhǎng)度
String name = t.split(",")[0];
return name.length()==4;
},
(t)->{
//切割字符串?dāng)?shù)組,判斷性別
String sex = t.split(",")[1];
return sex.equals("女");
});
System.out.println(arry);
}
public static ArrayList<String> method(String[] arr, Predicate<String> p1, Predicate<String> p2) {
//定義一個(gè)集合,存儲(chǔ)過(guò)濾之后的信息
ArrayList<String> list = new ArrayList<>();
//遍歷字符串?dāng)?shù)組
for (String s : arr) {
//使用and方法連接連個(gè)Predicate接口,比較
boolean b = p1.and(p2).test(s);
//對(duì)得到的布爾值進(jìn)行判斷
if (b){
//條件成立,存儲(chǔ)信息
list.add(s);
}
}
return list;
}
}
//結(jié)果:[迪麗熱巴,女, 古力娜扎,女]
Function接口
java.util.function.Function<T,R> 接口用來(lái)根據(jù)一個(gè)類(lèi)型的數(shù)據(jù)得到另一個(gè)類(lèi)型的數(shù)據(jù),前者稱(chēng)為前置條件,
后者稱(chēng)為后置條件。
抽象方法:apply
Function 接口中最主要的抽象方法為: R apply(T t) ,根據(jù)類(lèi)型T的參數(shù)獲取類(lèi)型R的結(jié)果。
使用的場(chǎng)景例如:將 String 類(lèi)型轉(zhuǎn)換為 Integer 類(lèi)型。
代碼演示:
import java.util.function.Function;
public class Demo11FunctionApply {
private static void method(Function<String, Integer> function) {
int num = function.apply("10");
System.out.println(num + 20);
}
public static void main(String[] args) {
method(s ‐> Integer.parseInt(s));
}
}
默認(rèn)方法:andThen
Function 接口中有一個(gè)默認(rèn)的 andThen 方法,用來(lái)進(jìn)行組合操作
需求:
- 把string類(lèi)型的"123",轉(zhuǎn)換為Inteter類(lèi)型,把轉(zhuǎn)換后的結(jié)果加10
- 把增加之后的Integer類(lèi)型的數(shù)據(jù)。轉(zhuǎn)換為String類(lèi)型
分析:
- 轉(zhuǎn)換了兩次
- 第一次是把string類(lèi)型轉(zhuǎn)換為了Integer類(lèi)型
所以我們可以使用Function<String, Integer> funI
Integer i - fuq1. apply(.“123”)+10;
第二次是把Integer類(lèi)型轉(zhuǎn)換為string類(lèi)型
所以我們可以使用Function<Integer. String> fun2
string s = fun2. opply(i);
我們可以使用andThen方法,把兩次轉(zhuǎn)換組合在一起使用
String S = fun1 pndThen(fun2). apply(“123”);
- fun1先調(diào)用apply方法,把字符串轉(zhuǎn)換為Integer
- fun2再調(diào)用apply方法,把Integer轉(zhuǎn)換為字符串

練習(xí):自定義函數(shù)模型拼接
題目
請(qǐng)使用 Function 進(jìn)行函數(shù)模型的拼接,按照順序需要執(zhí)行的多個(gè)函數(shù)操作為:
String str = “趙麗穎,20”;
- 將字符串截取數(shù)字年齡部分,得到字符串;
- 將上一步的字符串轉(zhuǎn)換成為int類(lèi)型的數(shù)字;
- 將上一步的int數(shù)字累加100,得到結(jié)果int數(shù)字。
代碼演示:
package com.itheima.demo01.Lambda;
import java.util.function.Function;
public class Demo07Test {
/**/
public static void method(String s, Function<String,Integer> fun){
Integer it = fun.apply(s);
System.out.println(it+100);
}
public static void main(String[] args) {
String str = "趙麗穎,20";
String age = str.split(",")[1];
method(age,
(ss)->{
return Integer.parseInt(ss);
});
}
}
//120
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
springboot2自動(dòng)加載sql文件的實(shí)現(xiàn)
本文主要介紹了springboot2自動(dòng)加載sql文件的實(shí)現(xiàn),通過(guò)配置文件或注解的方式,我們可以輕松地將SQL語(yǔ)句映射到數(shù)據(jù)庫(kù)中,實(shí)現(xiàn)自動(dòng)加載,感興趣的可以了解一下2023-11-11
詳解java數(shù)組進(jìn)行翻轉(zhuǎn)的方法有哪些
這篇文章主要介紹了詳解java數(shù)組進(jìn)行翻轉(zhuǎn)的方法有哪些,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Spring中BeanFactory?FactoryBean和ObjectFactory的三種的區(qū)別
關(guān)于FactoryBean?和?BeanFactory的對(duì)比文章比較多,但是對(duì)ObjectFactory的描述就比較少,今天我們對(duì)比下這三種的區(qū)別,感興趣的朋友跟隨小編一起看看吧2023-01-01
Java設(shè)計(jì)模式之策略模式原理與用法實(shí)例詳解
這篇文章主要介紹了Java設(shè)計(jì)模式之策略模式原理與用法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Java策略模式的概念、原理、定義及使用方法,并總結(jié)了相關(guān)的優(yōu)缺點(diǎn),具有一定參考借鑒價(jià)值,需要的朋友可以參考下2018-04-04
springboot2.x 接入阿里云市場(chǎng)短信發(fā)送的實(shí)現(xiàn)
本文主要介紹了springboot2.x 接入阿里云市場(chǎng)短信發(fā)送的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-11-11
Java中的JScrollPane使用詳細(xì)說(shuō)明
這篇文章主要給大家介紹了關(guān)于Java中JScrollPane使用的相關(guān)資料,Java JScrollPane是Swing庫(kù)提供的一個(gè)組件,用于在需要滾動(dòng)的區(qū)域中顯示內(nèi)容,需要的朋友可以參考下2024-07-07
詳解關(guān)于eclipse中使用jdk15對(duì)應(yīng)javafx15的配置問(wèn)題總結(jié)
這篇文章主要介紹了詳解關(guān)于eclipse中使用jdk15對(duì)應(yīng)javafx15的配置問(wèn)題總結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
詳解Java并發(fā)編程中的優(yōu)先級(jí)隊(duì)列PriorityBlockingQueue
PriorityBlockingQueue是Java中實(shí)現(xiàn)了堆數(shù)據(jù)結(jié)構(gòu)的線程安全的有界阻塞隊(duì)列。本文將會(huì)深入解讀PriorityBlockingQueue的源碼實(shí)現(xiàn),感興趣的可以了解一下2023-05-05
簡(jiǎn)單實(shí)現(xiàn)Java版學(xué)生管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了簡(jiǎn)單實(shí)現(xiàn)Java版學(xué)生管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06

