導航:首頁 > 編程語言 > predicatejava

predicatejava

發布時間:2022-10-30 11:32:33

Ⅰ 想要java軟體安裝包,有哪位朋友有嗎

軟體介紹

java se development kit 9 64位,簡稱為java9 64位,是由oracle公司官方推出的一款Java語言的軟體開發工具包,面向Java開發人員,包括一個完整的JRE以及用於開發、調試和監視Java應用的工具,是整個Java的核心,其中包括了Java運行環境(Java Runtime EnvirnmeJava開發工具和Java基礎類庫源代碼)。java se 9是Java Platform的新更新,此版本包括期待已久的新特性,如Java Platform模塊化、性能提升、支持新標准以及許多其他改進。其中Java Platform模塊化是java se development kit 9的最大特色,在引入了模塊系統之後,JDK 被重新組織成 94 個模塊。Java應用可以通過新增的jlink 工具,創建出只包含所依賴的JDK模塊的自定義運行時鏡像,這樣可以極大的減少Java 9運行時環境的大小,使得JDK可以在更小的設備中使用。

所需工具:點擊下載java se development kit 9


10、支持Unicode 8.0。JDK 8支持Unicode 6.2。


Unicode的6.3,7.0和8.0標准相結合引入10555個字元,29個腳本,和42塊,所有這些在JDK 9支撐。

java9 64位安裝教程:

1、軟體下載解壓完成後,點擊jdk-9_windows-x64打開軟體包,等待片刻後點擊下一步開始安裝軟體。


2、選擇安裝組件和安裝路徑。



3、確定軟體安裝目錄。



4、java9 64位安裝完成。



更新日誌

java se development kit 9是一個主要的功能版本,以下總結了Java SE 9和JDK 9(Oracle的Java SE 9的實現)中的功能和增強功能。


A、關鍵變化:


一、Java平台模塊系統


介紹一種新的Java編程組件,這個模塊是一個有名的,自描述的代碼和數據集合。這個模塊系統:


1、引入了一個新的可選階段,即鏈接時間,該時間在編譯時間和運行時間之間,在此期間可以將一組模塊組裝並優化為自定義運行時映像; 看到jlink在工具Java平台,標准版工具參考。


2、將選項添加到工具javac,jlink以及java可以指定模塊路徑的位置,這些模塊路徑定位了模塊的定義。


3、介紹模塊化的JAR文件,它是一個JAR文件,mole-info.class在其根目錄中有一個文件。


4、介紹JMOD格式,除了可以包含本地代碼和配置文件之外,它是與JAR類似的打包格式; 看到這個jmod工具。


二、JEP 223:新的版本字元串計劃


提供簡化的版本字元串格式,有助於清楚地區分主要,次要,安全和修補程序更新版本。


B、新增功能


1、使用安裝程序的用戶界面啟用或禁用Web部署


提供在安裝程序的歡迎頁面中啟用或禁用Web部署的選項。要啟用Web部署,請在「 歡迎」頁面中選擇「 自定義安裝」,單擊「 安裝」,然後選中「 在瀏覽器中啟用Java內容」復選框。


2、JEP 222:jshell:Java Shell(Read-Eval-Print Loop)


將Read-Eval-Print Loop(REPL)功能添加到Java平台。


該jshell工具提供了一個用於評估Java編程語言的聲明,語句和表達式的互動式命令行界面。

它有助於對編碼選項進行原型設計和探索,並立即得到結果和反饋。即時反饋與以表達式開始的能力相結合對教育非常有用,無論是學習Java語言,還是學習新的API或語言功能。


3、JEP 228:添加更多的診斷命令


定義其他診斷命令以提高診斷Hotspot和JDK問題的能力。


3、JEP 231:刪除啟動時JRE版本選擇


刪除了在啟動時請求不是JRE版本的JRE版本的功能。


4、JEP 238:多版本JAR文件


擴展JAR文件格式,使多個Java特定版本的類文件能夠共存於一個歸檔中。


5、JEP 240:刪除JVM TI hprof代理


hprof從JDK中刪除代理。該hprof代理程序被編寫為JVM工具介面的演示代碼,並不打算成為生產工具。


6、JEP 241:刪除jhat工具


jhat從JDK中刪除該工具。


7、JEP 245:驗證JVM命令行標志參數


驗證所有數字JVM命令行標志的參數以避免失敗,如果發現它們是無效的,則會顯示相應的錯誤消息。

Ⅱ java list集合怎麼交集

1.8

		finalList<String>l1=newArrayList<String>();
l1.add("a");l1.add("b");l1.add("c");l1.add("d");
List<String>l2=newArrayList<String>();
l2.add("b");l2.add("c");l2.add("d");l2.add("e");

List<String>result=newArrayList<String>();
result.addAll(l2);

result.removeIf(newPredicate<String>(){
@Override
publicbooleantest(Stringt){
return!l1.contains(t);
}
});

System.err.println(result);

普通操作:

		finalList<String>l1=newArrayList<String>();
l1.add("a");l1.add("b");l1.add("c");l1.add("d");
List<String>l2=newArrayList<String>();
l2.add("b");l2.add("c");l2.add("d");l2.add("e");

List<String>result=newArrayList<String>();

for(Strings:l2){
if(l1.contains(s)){
result.add(s);
}
}

System.err.println(result);

Ⅲ Java8的特性有哪些

1、函數式介面
Java 8 引入的一個核心概念是函數式介面(Functional Interfaces)。通過在介面裡面添加一個抽象方法,這些方法可以直接從介面中運行。如果一個介面定義個唯一一個抽象方法,那麼這個介面就成為函數式介面。同時,引入了一個新的註解:@FunctionalInterface。可以把他它放在一個介面前,表示這個介面是一個函數式介面。這個註解是非必須的,只要介面只包含一個方法的介面,虛擬機會自動判斷,不過最好在介面上使用註解 @FunctionalInterface 進行聲明。在介面中添加了 @FunctionalInterface 的介面,只允許有一個抽象方法,否則編譯器也會報錯。
java.lang.Runnable 就是一個函數式介面。
@FunctionalInterface
public interface Runnable {
public abstract void run();
}

2、Lambda 表達式
函數式介面的重要屬性是:我們能夠使用 Lambda 實例化它們,Lambda 表達式讓你能夠將函數作為方法參數,或者將代碼作為數據對待。Lambda 表達式的引入給開發者帶來了不少優點:在 Java 8 之前,匿名內部類,監聽器和事件處理器的使用都顯得很冗長,代碼可讀性很差,Lambda 表達式的應用則使代碼變得更加緊湊,可讀性增強;Lambda 表達式使並行操作大集合變得很方便,可以充分發揮多核 CPU 的優勢,更易於為多核處理器編寫代碼;
Lambda 表達式由三個部分組成:第一部分為一個括弧內用逗號分隔的形式參數,參數是函數式介面裡面方法的參數;第二部分為一個箭頭符號:->;第三部分為方法體,可以是表達式和代碼塊。語法如下:
1. 方法體為表達式,該表達式的值作為返回值返回。
(parameters) -> expression

2. 方法體為代碼塊,必須用 {} 來包裹起來,且需要一個 return 返回值,但若函數式介面裡面方法返回值是 void,則無需返回值。
(parameters) -> { statements; }
例如,下面是使用匿名內部類和 Lambda 表達式的代碼比較。

下面是用匿名內部類的代碼:
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.print("Helllo Lambda in actionPerformed");
}
});
下面是使用 Lambda 表達式後:
button.addActionListener(
\\actionPerformed 有一個參數 e 傳入,所以用 (ActionEvent e)
(ActionEvent e)->
System.out.print("Helllo Lambda in actionPerformed")
);

上面是方法體包含了參數傳入 (ActionEvent e),如果沒有參數則只需 ( ),例如 Thread 中的 run 方法就沒有參數傳入,當它使用 Lambda 表達式後:
Thread t = new Thread(
\\run 沒有參數傳入,所以用 (), 後面用 {} 包起方法體
() -> {
System.out.println("Hello from a thread in run");
}
);
通過上面兩個代碼的比較可以發現使用 Lambda 表達式可以簡化代碼,並提高代碼的可讀性。
為了進一步簡化 Lambda 表達式,可以使用方法引用。例如,下面三種分別是使用內部類,使用 Lambda 表示式和使用方法引用方式的比較:
//1. 使用內部類
Function<Integer, String> f = new Function<Integer,String>(){
@Override
public String apply(Integer t) {
return null;
}
};
//2. 使用 Lambda 表達式
Function<Integer, String> f2 = (t)->String.valueOf(t);
//3. 使用方法引用的方式
Function<Integer, String> f1 = String::valueOf;

要使用 Lambda 表達式,需要定義一個函數式介面,這樣往往會讓程序充斥著過量的僅為 Lambda 表達式服務的函數式介面。為了減少這樣過量的函數式介面,Java 8 在 java.util.function 中增加了不少新的函數式通用介面。例如:
Function<T, R>:將 T 作為輸入,返回 R 作為輸出,他還包含了和其他函數組合的默認方法。
Predicate<T> :將 T 作為輸入,返回一個布爾值作為輸出,該介麵包含多種默認方法來將 Predicate 組合成其他復雜的邏輯(與、或、非)。
Consumer<T> :將 T 作為輸入,不返回任何內容,表示在單個參數上的操作。
例如,People 類中有一個方法 getMaleList 需要獲取男性的列表,這里需要定義一個函數式介面 PersonInterface:
interface PersonInterface {
public boolean test(Person person);
}
public class People {
private List<Person> persons= new ArrayList<Person>();
public List<Person> getMaleList(PersonInterface filter) {
List<Person> res = new ArrayList<Person>();
persons.forEach(
(Person person) ->
{
if (filter.test(person)) {//調用 PersonInterface 的方法
res.add(person);
}
}
);
return res;
}
}
為了去除 PersonInterface 這個函數式介面,可以用通用函數式介面 Predicate 替代如下:
class People{
private List<Person> persons= new ArrayList<Person>();
public List<Person> getMaleList(Predicate<Person> predicate) {
List<Person> res = new ArrayList<Person>();
persons.forEach(
person -> {
if (predicate.test(person)) {//調用 Predicate 的抽象方法 test
res.add(person);
}
});
return res;
}
}

3、介面的增強
Java 8 對介面做了進一步的增強。在介面中可以添加使用 default 關鍵字修飾的非抽象方法。還可以在介面中定義靜態方法。如今,介面看上去與抽象類的功能越來越類似了。
默認方法
Java 8 還允許我們給介面添加一個非抽象的方法實現,只需要使用 default 關鍵字即可,這個特徵又叫做擴展方法。在實現該介面時,該默認擴展方法在子類上可以直接使用,它的使用方式類似於抽象類中非抽象成員方法。但擴展方法不能夠重載 Object 中的方法。例如:toString、equals、 hashCode 不能在介面中被重載。
例如,下面介面中定義了一個默認方法 count(),該方法可以在子類中直接使用。
public interface DefaultFunInterface {
//定義默認方法 countdefault int count(){
return 1;
}
}
public class SubDefaultFunClass implements DefaultFunInterface {
public static void main(String[] args){
//實例化一個子類對象,改子類對象可以直接調用父介面中的默認方法 count
SubDefaultFunClass sub = new SubDefaultFunClass();
sub.count();
}
}

靜態方法
在介面中,還允許定義靜態的方法。介面中的靜態方法可以直接用介面來調用。
例如,下面介面中定義了一個靜態方法 find,該方法可以直接用 StaticFunInterface .find() 來調用。
public interface StaticFunInterface {public static int find(){
return 1;
}
}
public class TestStaticFun {
public static void main(String[] args){
//介面中定義了靜態方法 find 直接被調用
StaticFunInterface.fine();
}
}

Ⅳ Java中JSONArray如何獲取數據

轉化為json對象去做吧.JSON.parse()或者eval()都可以轉化的

轉化完之後 通過 對象的屬性去拿值

比如說.

varjson=[{"name":"test",
"conditions":[
{"subject":"ip",
"predicate":"default",
"value":"10.180.26.1"}],
"actions":[{
"act":"forceedgetocache",
"seconds":2}]}];
varjsonObj=JSON.parse(json);
jsonObj.conditions就是你要的吧

Ⅳ JAVA集合中新增的Predicate中這個ele參數是什麼意思

這是個lambda表達式,即

books.removeIf(ele->((String)ele).length<10);

相當於

booleantestFunction(Stringelement)
{
if(element.length<10)
returntrue;
else
returnfalse;
}


books.removeIf(testFunction())

即將集合內所有長度小於10的元素都刪去。現代計算機語言往往為了優化編譯和運算速度採用lambda表達式的形式,相當於調用一個不需要命名的函數

Ⅵ java如何判斷字元串為八位的字母字元

public static void main(String[] args) {
System.out.println("請輸入一個八位的字元串:");
Scanner scanner = new Scanner(System.in);
String str = scanner.nextLine();

//判斷字元串是否是八位
if(str.length() != 8){
System.out.println("字元串不是八位");
return;
}
char [] c =str.toCharArray();
for (char c1 : c) {
//判斷c是否是字母字元,前面LowerCase是小寫,後面UpperCase是大寫,是返回True,否則返回False
if(!Character.isLowerCase(c1) && !Character.isUpperCase(c1)){
System.out.println("字元串有非字母的字元!");
return;
}
}
}

Ⅶ 試編程:求一個數的絕對值。列如輸入-5,則輸出5。第1題怎麼寫

作者 | 沉默王二

來源 | CSDN博客

頭圖 | 付費下載自視覺中國

出品 | CSDN(ID:CSDNnews)
想學習,永遠都不晚,尤其是針對 Java 8 裡面的好東西,Optional 就是其中之一,該類提供了一種用於表示可選值而非空引用的類級別解決方案。作為一名 Java 程序員,我真的是煩透了 NullPointerException(NPE),盡管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一個對象卻發現這個對象的值為 null,於是 Java 虛擬機就怒發沖冠地把它拋了出來當做替罪羊。

當然了,我們程序員是富有責任心的,不會坐視不管,於是就有了大量的 null 值檢查。盡管有時候這種檢查完全沒有必要,但我們已經習慣了例行公事。終於,Java 8 看不下去了,就引入了 Optional,以便我們編寫的代碼不再那麼刻薄呆板。
沒有 Optional 會有什麼問題
我們來模擬一個實際的應用場景。小王第一天上班,領導老馬就給他安排了一個任務,要他從資料庫中根據會員 ID 拉取一個會員的姓名,然後將姓名列印到控制台。雖然是新來的,但這個任務難不倒小王,於是他花了 10 分鍾寫下了這段代碼:
1public class WithoutOptionalDemo {
2 class Member {
3 private String name;
4
5 public String getName() {
6 return name;
7 }
8
9 public void setName(String name) {
10 this.name = name;
11 }
12 }
13
14 public static void main(String[] args) {
15 Member mem = getMemberByIdFromDB();
16 if (mem != null) {
17 System.out.println(mem.getName());
18 }
19 }
20
21 public static Member getMemberByIdFromDB() {
22 // 當前 ID 的會員不存在
23 return null;
24 }
25}

由於當前 ID 的會員不存在,所以 getMemberByIdFromDB() 方法返回了 null 來作為沒有獲取到該會員的結果,那就意味著在列印會員姓名的時候要先對 mem 判空,否則就會拋出 NPE 異常,不信?讓小王把 if (mem != null) 去掉試試,控制台立馬列印錯誤堆棧給你顏色看看。
1Exception in thread "main" java.lang.NullPointerException
2 at com.cmower.dzone.optional.WithoutOptionalDemo.main(WithoutOptionalDemo.java:24)

Optional 是如何解決這個問題的
小王把代碼提交後,就興高采烈地去找老馬要新的任務了。本著虛心學習的態度,小王請求老馬看一下自己的代碼,於是老王就告訴他應該嘗試一下 Optional,可以避免沒有必要的 null 值檢查。現在,讓我們來看看小王是如何通過 Optional 來解決上述問題的。
1public class OptionalDemo {
2 public static void main(String[] args) {
3 Optional optional = getMemberByIdFromDB();
4 optional.ifPresent(mem -> {
5 System.out.println("會員姓名是:" + mem.getName());
6 });
7 }
8
9 public static Optional getMemberByIdFromDB() {
10 boolean hasName = true;
11 if (hasName) {
12 return Optional.of(new Member("沉默王二"));
13 }
14 return Optional.empty();
15 }
16}
17class Member {
18 private String name;
19
20 public String getName() {
21 return name;
22 }
23
24 // getter / setter
25}

getMemberByIdFromDB() 方法返回了 Optional 作為結果,這樣就表明 Member 可能存在,也可能不存在,這時候就可以在 Optional 的 ifPresent() 方法中使用 Lambda 表達式來直接列印結果。
Optional 之所以可以解決 NPE 的問題,是因為它明確的告訴我們,不需要對它進行判空。它就好像十字路口的路標,明確地告訴你該往哪走。
創建 Optional 對象
1)可以使用靜態方法 empty() 創建一個空的 Optional 對象
1Optional empty = Optional.empty();
2System.out.println(empty); // 輸出:Optional.empty

2)可以使用靜態方法 of() 創建一個非空的 Optional 對象
1Optional opt = Optional.of("沉默王二");
2System.out.println(opt); // 輸出:Optional[沉默王二]

當然了,傳遞給 of() 方法的參數必須是非空的,也就是說不能為 null,否則仍然會拋出 NullPointerException。
1String name = null;
2Optional optnull = Optional.of(name);

3)可以使用靜態方法 ofNullable() 創建一個即可空又可非空的 Optional 對象
1String name = null;
2Optional optOrNull = Optional.ofNullable(name);
3System.out.println(optOrNull); // 輸出:Optional.empty

ofNullable() 方法內部有一個三元表達式,如果為參數為 null,則返回私有常量 EMPTY;否則使用 new 關鍵字創建了一個新的 Optional 對象——不會再拋出 NPE 異常了。
判斷值是否存在
可以通過方法 isPresent() 判斷一個 Optional 對象是否存在,如果存在,該方法返回 true,否則返回 false——取代了 obj != null 的判斷。
1Optional opt = Optional.of("沉默王二");
2System.out.println(opt.isPresent()); // 輸出:true
3
4Optional optOrNull = Optional.ofNullable(null);
5System.out.println(opt.isPresent()); // 輸出:false

Java 11 後還可以通過方法 isEmpty() 判斷與 isPresent() 相反的結果。
1Optional opt = Optional.of("沉默王二");
2System.out.println(opt.isPresent()); // 輸出:false
3
4Optional optOrNull = Optional.ofNullable(null);
5System.out.println(opt.isPresent()); // 輸出:true

非空表達式
Optional 類有一個非常現代化的方法——ifPresent(),允許我們使用函數式編程的方式執行一些代碼,因此,我把它稱為非空表達式。如果沒有該方法的話,我們通常需要先通過 isPresent() 方法對 Optional 對象進行判空後再執行相應的代碼:
1Optional optOrNull = Optional.ofNullable(null);
2if (optOrNull.isPresent()) {
3 System.out.println(optOrNull.get().length());
4}

有了 ifPresent() 之後,情況就完全不同了,可以直接將 Lambda 表達式傳遞給該方法,代碼更加簡潔,更加直觀。
1Optional opt = Optional.of("沉默王二");
2opt.ifPresent(str -> System.out.println(str.length()));

Java 9 後還可以通過方法 ifPresentOrElse(action, emptyAction) 執行兩種結果,非空時執行 action,空時執行 emptyAction。
1Optional opt = Optional.of("沉默王二");
2opt.ifPresentOrElse(str -> System.out.println(str.length()), () -> System.out.println("為空"));

設置(獲取)默認值
有時候,我們在創建(獲取) Optional 對象的時候,需要一個默認值,orElse() 和 orElseGet() 方法就派上用場了。
orElse() 方法用於返回包裹在 Optional 對象中的值,如果該值不為 null,則返回;否則返回默認值。該方法的參數類型和值得類型一致。
1String nullName = null;
2String name = Optional.ofNullable(nullName).orElse("沉默王二");
3System.out.println(name); // 輸出:沉默王二

orElseGet() 方法與 orElse() 方法類似,但參數類型不同。如果 Optional 對象中的值為 null,則執行參數中的函數。
1String nullName = null;
2String name = Optional.ofNullable(nullName).orElseGet(()->"沉默王二");
3System.out.println(name); // 輸出:沉默王二

從輸出結果以及代碼的形式上來看,這兩個方法極其相似,這不免引起我們的懷疑,Java 類庫的設計者有必要這樣做嗎?
假設現在有這樣一個獲取默認值的方法,很傳統的方式。
1public static String getDefaultValue() {
2 System.out.println("getDefaultValue");
3 return "沉默王二";
4}

然後,通過 orElse() 方法和 orElseGet() 方法分別調用 getDefaultValue() 方法返回默認值。
1public static void main(String[] args) {
2 String name = null;
3 System.out.println("orElse");
4 String name2 = Optional.ofNullable(name).orElse(getDefaultValue());
5
6 System.out.println("orElseGet");
7 String name3 = Optional.ofNullable(name).orElseGet(OrElseOptionalDemo::getDefaultValue);
8}

註:類名 :: 方法名是 Java 8 引入的語法,方法名後面是沒有 () 的,表明該方法並不一定會被調用。
輸出結果如下所示:
1orElse
2getDefaultValue
3
4orElseGet
5getDefaultValue

輸出結果是相似的,沒什麼太大的不同,這是在 Optional 對象的值為 null 的情況下。假如 Optional 對象的值不為 null 呢?
1public static void main(String[] args) {
2 String name = "沉默王三";
3 System.out.println("orElse");
4 String name2 = Optional.ofNullable(name).orElse(getDefaultValue());
5
6 System.out.println("orElseGet");
7 String name3 = Optional.ofNullable(name).orElseGet(OrElseOptionalDemo::getDefaultValue);
8}

輸出結果如下所示:
1orElse
2getDefaultValue
3orElseGet

咦,orElseGet() 沒有去調用 getDefaultValue()。哪個方法的性能更佳,你明白了吧?
獲取值
直觀從語義上來看,get() 方法才是最正宗的獲取 Optional 對象值的方法,但很遺憾,該方法是有缺陷的,因為假如 Optional 對象的值為 null,該方法會拋出 NoSuchElementException 異常。這完全與我們使用 Optional 類的初衷相悖。
1public class GetOptionalDemo {
2 public static void main(String[] args) {
3 String name = null;
4 Optional optOrNull = Optional.ofNullable(name);
5 System.out.println(optOrNull.get());
6 }
7}

這段程序在運行時會拋出異常:
1Exception in thread "main" java.util.NoSuchElementException: No value present
2 at java.base/java.util.Optional.get(Optional.java:141)
3 at com.cmower.dzone.optional.GetOptionalDemo.main(GetOptionalDemo.java:9)

盡管拋出的異常是 NoSuchElementException 而不是 NPE,但在我們看來,顯然是在「五十步笑百步」。建議 orElseGet() 方法獲取 Optional 對象的值。
過濾值
小王通過 Optional 類對之前的代碼進行了升級,完成後又興高采烈地跑去找老馬要任務了。老馬覺得這小夥子不錯,頭腦靈活,又幹活積極,很值得培養,就又交給了小王一個新的任務:用戶注冊時對密碼的長度進行檢查。
小王拿到任務後,樂開了花,因為他剛要學習 Optional 類的 filter() 方法,這就派上了用場。
1public class FilterOptionalDemo {
2 public static void main(String[] args) {
3 String password = "12345";
4 Optional opt = Optional.ofNullable(password);
5 System.out.println(opt.filter(pwd -> pwd.length() > 6).isPresent());
6 }
7}

filter() 方法的參數類型為 Predicate(Java 8 新增的一個函數式介面),也就是說可以將一個 Lambda 表達式傳遞給該方法作為條件,如果表達式的結果為 false,則返回一個 EMPTY 的 Optional 對象,否則返回過濾後的 Optional 對象。
在上例中,由於 password 的長度為 5 ,所以程序輸出的結果為 false。假設密碼的長度要求在 6 到 10 位之間,那麼還可以再追加一個條件。來看小王增加難度後的代碼。
1Predicate len6 = pwd -> pwd.length() > 6;
2Predicate len10 = pwd -> pwd.length() < 10;
3
4password = "1234567";
5opt = Optional.ofNullable(password);
6boolean result = opt.filter(len6.and(len10)).isPresent();
7System.out.println(result);

這次程序輸出的結果為 true,因為密碼變成了 7 位,在 6 到 10 位之間。想像一下,假如小王使用 if-else 來完成這個任務,代碼該有多冗長。
轉換值
小王檢查完了密碼的長度,仍然覺得不夠盡興,覺得要對密碼的強度也進行檢查,比如說密碼不能是「password」,這樣的密碼太弱了。於是他又開始研究起了 map() 方法,該方法可以按照一定的規則將原有 Optional 對象轉換為一個新的 Optional 對象,原有的 Optional 對象不會更改。
先來看小王寫的一個簡單的例子:
1public class OptionalMapDemo {
2 public static void main(String[] args) {
3 String name = "沉默王二";
4 Optional nameOptional = Optional.of(name);
5 Optional intOpt = nameOptional
6 .map(String::length);
7
8 System.out.println( intOpt.orElse(0));
9 }
10}

在上面這個例子中,map() 方法的參數 String::length,意味著要 將原有的字元串類型的 Optional 按照字元串長度重新生成一個新的 Optional 對象,類型為 Integer。
搞清楚了 map() 方法的基本用法後,小王決定把 map() 方法與 filter() 方法結合起來用,前者用於將密碼轉化為小寫,後者用於判斷長度以及是否是「password」。
1public class OptionalMapFilterDemo {
2 public static void main(String[] args) {
3 String password = "password";
4 Optional opt = Optional.ofNullable(password);
5
6 Predicate len6 = pwd -> pwd.length() > 6;
7 Predicate len10 = pwd -> pwd.length() < 10;
8 Predicate eq = pwd -> pwd.equals("password");
9
10 boolean result = opt.map(String::toLowerCase).filter(len6.and(len10 ).and(eq)).isPresent();
11 System.out.println(result);
12 }
13}

好了,我親愛的讀者朋友,以上就是本文的全部內容了——可以說是史上最佳 Optional 指南了,能看到這里的都是最優秀的程序員,二哥必須要伸出大拇指為你點個贊。
https://blog.csdn.net/qing_gee/article/details/104767082

Ⅷ java中Spring data jpa通過Predicate查詢時間段

public interface JpaSpecificationExecutor<T> {
T findOne(Specification<T> var1);

List<T> findAll(Specification<T> var1);

Page<T> findAll(Specification<T> var1, Pageable var2);

List<T> findAll(Specification<T> var1, Sort var2);

long count(Specification<T> var1);

Ⅸ 如何更好地使用Java 8的Optional

我們知道 Java 8 增加了一些很有用的 API, 其中一個就是 Optional. 如果對它不稍假探索, 只是輕描淡寫的認為它可以優雅的解決 NullPointException 的問題, 於是代碼就開始這么寫了
Optional<User> user = ......
if (user.isPresent()) {
return user.getOrders();
} else {
return Collections.emptyList();
}

那麼不得不說我們的思維仍然是在原地踏步, 只是本能的認為它不過是 User 實例的包裝, 這與我們之前寫成
User user = .....
if (user != null) {
return user.getOrders();
} else {
return Collections.emptyList();
}

實質上是沒有任何分別. 這就是我們將要講到的使用好 java 8 Optional 類型的正確姿勢.
在里約奧運之時, 新聞一再提起五星紅旗有問題, 可是我怎麼看都看不出來有什麼問題, 後來才道是小星星膜拜中央的姿勢不對. 因此我們千萬也別對自己習以為常的事情覺得理所當然, 絲毫不會覺得有何不妥, 換句話說也就是當我們切換到 Java 8 的 Optional 時, 不能繼承性的對待過往 null 時的那種思維, 應該掌握好新的, 正確的使用 Java 8 Optional 的正確姿勢.
直白的講, 當我們還在以如下幾種方式使用 Optional 時, 就得開始檢視自己了
調用 isPresent() 方法時
調用 get() 方法時
Optional 類型作為類/實例屬性時
Optional 類型作為方法參數時
isPresent() 與 obj != null 無任何分別, 我們的生活依然在步步驚心. 而沒有 isPresent() 作鋪墊的 get() 調用在 IntelliJ IDEA 中會收到告警
Reports calls to java.util.Optional.get() without first checking with a isPresent() call if a value is available. If the Optional does not contain a value, get() will throw an exception. (調用 Optional.get() 前不事先用 isPresent() 檢查值是否可用. 假如 Optional 不包含一個值, get() 將會拋出一個異常)
把 Optional 類型用作屬性或是方法參數在 IntelliJ IDEA 中更是強力不推薦的
Reports any uses of java.util.Optional<T>, java.util.OptionalDouble, java.util.OptionalInt, java.util.OptionalLong or com.google.common.base.Optional as the type for a field or a parameter. Optional was designed to provide a limited mechanism for library method return types where there needed to be a clear way to represent 「no result」. Using a field with type java.util.Optional is also problematic if the class needs to be Serializable, which java.util.Optional is not. (使用任何像 Optional 的類型作為欄位或方法參數都是不可取的. Optional 只設計為類庫方法的, 可明確表示可能無值情況下的返回類型. Optional 類型不可被序列化, 用作欄位類型會出問題的)
所以 Optional 中我們真正可依賴的應該是除了 isPresent() 和 get() 的其他方法:
public<U> Optional<U> map(Function<? super T, ? extends U> mapper)
public T orElse(T other)
public T orElseGet(Supplier<? extends T> other)
public void ifPresent(Consumer<? super T> consumer)
public Optional<T> filter(Predicate<? super T> predicate)
public<U> Optional<U> flatMap(Function<? super T, Optional<U>> mapper)
public <X extends Throwable> T orElseThrow(Supplier<? extends X> exceptionSupplier) throws X
我略有自信的按照它們大概使用頻度對上面的方法排了一下序.
先又不得不提一下 Optional 的三種構造方式: Optional.of(obj), Optional.ofNullable(obj) 和明確的 Optional.empty()
Optional.of(obj): 它要求傳入的 obj 不能是 null 值的, 否則還沒開始進入角色就倒在了 NullPointerException 異常上了.
Optional.ofNullable(obj): 它以一種智能的, 寬容的方式來構造一個 Optional 實例. 來者不拒, 傳 null 進到就得到 Optional.empty(), 非 null 就調用 Optional.of(obj).
那是不是我們只要用 Optional.ofNullable(obj) 一勞永逸, 以不變應二變的方式來構造 Optional 實例就行了呢? 那也未必, 否則 Optional.of(obj) 何必如此暴露呢, 私有則可?
我本人的觀點是: 1. 當我們非常非常的明確將要傳給 Optional.of(obj) 的 obj 參數不可能為 null 時, 比如它是一個剛 new 出來的對象(Optional.of(new User(...))), 或者是一個非 null 常量時; 2. 當想為 obj 斷言不為 null 時, 即我們想在萬一 obj 為 null 立即報告 NullPointException 異常, 立即修改, 而不是隱藏空指針異常時, 我們就應該果斷的用 Optional.of(obj) 來構造 Optional 實例, 而不讓任何不可預計的 null 值有可乘之機隱身於 Optional 中.
現在才開始怎麼去使用一個已有的 Optional 實例, 假定我們有一個實例 Optional<User> user, 下面是幾個普遍的, 應避免 if(user.isPresent()) { ... } else { ... } 幾中應用方式.
存在即返回, 無則提供默認值
return user.orElse(null); //而不是 return user.isPresent() ? user.get() : null;
return user.orElse(UNKNOWN_USER);

存在即返回, 無則由函數來產生
return user.orElseGet(() -> fetchAUserFromDatabase()); //而不要 return user.isPresent() ? user: fetchAUserFromDatabase();

存在才對它做點什麼
user.ifPresent(System.out::println);

//而不要下邊那樣
if (user.isPresent()) {
System.out.println(user.get());
}

map 函數隆重登場
當 user.isPresent() 為真, 獲得它關聯的 orders, 為假則返回一個空集合時, 我們用上面的 orElse, orElseGet 方法都乏力時, 那原本就是 map 函數的責任, 我們可以這樣一行
return user.map(u -> u.getOrders()).orElse(Collections.emptyList())

//上面避免了我們類似 Java 8 之前的做法
if(user.isPresent()) {
return user.get().getOrders();
} else {
return Collections.emptyList();
}

map 是可能無限級聯的, 比如再深一層, 獲得用戶名的大寫形式
return user.map(u -> u.getUsername())
.map(name -> name.toUpperCase())
.orElse(null);

這要擱在以前, 每一級調用的展開都需要放一個 null 值的判斷
User user = .....
if(user != null) {
String name = user.getUsername();
if(name != null) {
return name.toUpperCase();
} else {
return null;
}
} else {
return null;
}

針對這方面 Groovy 提供了一種安全的屬性/方法訪問操作符 ?.
user?.getUsername()?.toUpperCase();

Swift 也有類似的語法, 只作用在 Optional 的類型上.
用了 isPresent() 處理 NullPointerException 不叫優雅, 有了 orElse, orElseGet 等, 特別是 map 方法才叫優雅.
其他幾個, filter() 把不符合條件的值變為 empty(), flatMap() 總是與 map() 方法成對的, orElseThrow() 在有值時直接返回, 無值時拋出想要的異常.
一句話小結: 使用 Optional 時盡量不直接調用 Optional.get() 方法, Optional.isPresent() 更應該被視為一個私有方法, 應依賴於其他像 Optional.orElse(), Optional.orElseGet(), Optional.map() 等這樣的方法.
最後, 最好的理解 Java 8 Optional 的方法莫過於看它的源代碼 java.util.Optional, 閱讀了源代碼才能真真正正的讓你解釋起來最有底氣, Optional 的方法中基本都是內部調用 isPresent() 判斷, 真時處理值, 假時什麼也不做.

Ⅹ Java8的函數式編程怎麼樣

使用函數式代碼的好處:

減少了可變數(Immutable Variable)的聲明
能夠更好的利用並行(Parallelism)
代碼更加簡潔和可讀
函數式介面

函數式介面就是僅聲明了一個方法的介面,比如我們熟悉的Runnable,Callable,Comparable等都可以作為函數式介面。當然,在Java 8中,新添加了一類函數式介面,如Function,Predicate,Consumer,Supplier等。

閱讀全文

與predicatejava相關的資料

熱點內容
javavector與list的區別 瀏覽:313
java初始化類數組 瀏覽:302
java字元串轉換成json對象 瀏覽:647
android非阻塞socket 瀏覽:358
編譯系統概念 瀏覽:450
天眼通app能做什麼 瀏覽:555
魅族手機怎麼加密圖庫 瀏覽:8
rpa編譯器 瀏覽:570
車載雲伺服器記錄 瀏覽:738
四川金星壓縮機製造有限公司 瀏覽:53
移動平台圖片壓縮演算法 瀏覽:35
銀行項目java 瀏覽:569
怎樣將pdf轉換為ppt 瀏覽:595
純凈伺服器怎麼開服 瀏覽:286
比澤爾壓縮機如何換油 瀏覽:818
編譯鏈接如何生成exe 瀏覽:74
jre編譯運行環境 瀏覽:271
怎麼解壓鏡像系統 瀏覽:190
程序員求助國企 瀏覽:838
雲伺服器網址租用多少錢 瀏覽:942