Java基礎 - Stream 流:Stream API的中間操作

在上一篇博客中,我介紹了構建 Stream 流的多種方式,以及 Stream 流的特點和優勢。如果你還沒有閱讀,你可以點擊這里查看。

Java基礎 - Stream 流:構建流的多種方式

在這篇博客中,我將探索 Stream API 的中間操作,它們可以讓你對 Stream 流進行各種轉換和過濾,從而得到你想要的結果。

Stream API 的中間操作是指那些返回一個新的 Stream 流對象的操作,它們不會消耗 Stream 流,也不會產生最終的結果,而是可以鏈式地調用,形成一個操作管道。Stream API 提供了很多中間操作,可以分為以下幾類:

  • 篩選和切片:這類操作可以讓你從 Stream 流中選擇或者排除一些元素,例如 filter, distinct, limit, skip 等。
  • 映射:這類操作可以讓你將 Stream 流中的每個元素轉換為另一種類型或者形式,例如 map, flatMap, peek 等。
  • 排序:這類操作可以讓你對 Stream 流中的元素進行排序,例如 sorted, reverseOrder 等。
  • 搜索:這類操作可以讓你在 Stream 流中查找某些元素或者條件,例如 findAny, findFirst, anyMatch, allMatch, noneMatch 等。
  • 截斷:這類操作可以讓你在 Stream 流中截取某些元素或者條件,例如 takeWhile, dropWhile 等。

下面,我將用一些示例來展示這些中間操作的用法和效果。

1. 篩選和切片

1.1 filter

filter 操作可以讓你根據一個謂詞(Predicate)來篩選出 Stream 流中符合條件的元素,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用 filter 操作篩選出偶數
Stream<Integer> evenStream = numberStream.filter(n -> n % 2 == 0);// 輸出 [2, 4, 6, 8, 10]
evenStream.forEach(System.out::println);

1.2 distinct

distinct 操作可以讓你去除 Stream 流中的重復元素,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "cat", "elephant", "dog", "fox");// 使用 distinct 操作去除重復元素
Stream<String> uniqueStream = animalStream.distinct();// 輸出 [cat, dog, elephant, fox]
uniqueStream.forEach(System.out::println);

1.3 limit

limit 操作可以讓你限制 Stream 流中的元素個數,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<String> fruitStream = Stream.of("apple", "banana", "cherry", "durian", "elderberry", "fig");// 使用 limit 操作限制元素個數為 3
Stream<String> limitedStream = fruitStream.limit(3);// 輸出 [apple, banana, cherry]
limitedStream.forEach(System.out::println);

1.4 skip

skip 操作可以讓你跳過 Stream 流中的前 n 個元素,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<String> colorStream = Stream.of("red", "green", "blue", "yellow", "pink", "purple");// 使用 skip 操作跳過前 2 個元素
Stream<String> skippedStream = colorStream.skip(2);// 輸出 [blue, yellow, pink, purple]
skippedStream.forEach(System.out::println);

2. 映射

2.1 map

map 操作可以讓你將 Stream 流中的每個元素映射為另一種類型或者形式,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<String> nameStream = Stream.of("Alice", "Bob", "Charlie", "David");// 使用 map 操作將每個元素轉換為大寫
Stream<String> upperStream = nameStream.map(String::toUpperCase);// 輸出 [ALICE, BOB, CHARLIE, DAVID]
upperStream.forEach(System.out::println);

2.2 flatMap

flatMap 操作可以讓你將 Stream 流中的每個元素映射為另一個 Stream 流對象,然后將這些 Stream 流對象合并為一個 Stream 流對象,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<String> sentenceStream = Stream.of("Hello world", "Java 8", "Stream API");// 使用 flatMap 操作將每個元素分割為單詞,并合并為一個 Stream 流對象
Stream<String> wordStream = sentenceStream.flatMap(s -> Stream.of(s.split(" ")));// 輸出 [Hello, world, Java, 8, Stream, API]
wordStream.forEach(System.out::println);

2.3 peek

peek 操作可以讓你在 Stream 流中的每個元素上執行一個消費者(Consumer)操作,同時返回一個新的 Stream 流對象,它和原來的 Stream 流對象包含相同的元素。這個操作通常用于調試或者觀察 Stream 流的中間狀態。例如:

// 創建一個 Stream 流對象
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用 peek 操作在每個元素上打印一個消息
Stream<Integer> peekedStream = numberStream.peek(n -> System.out.println("Processing " + n));// 輸出 [1, 2, 3, 4, 5]
peekedStream.forEach(System.out::println);

3. 排序

3.1 sorted

sorted 操作可以讓你對 Stream 流中的元素進行自然排序或者指定排序規則,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");// 使用 sorted 操作對元素進行自然排序
Stream<String> sortedStream = animalStream.sorted();// 輸出 [cat, dog, elephant, fox, giraffe]
sortedStream.forEach(System.out::println);// 使用 sorted 操作對元素進行指定排序規則,按照長度逆序
Stream<String> reversedStream = animalStream.sorted((s1, s2) -> s2.length() - s1.length());// 輸出 [elephant, giraffe, cat, dog, fox]
reversedStream.forEach(System.out::println);

3.2 reverseOrder

reverseOrder 操作可以讓你對 Stream 流中的元素進行逆序排序,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用 reverseOrder 操作對元素進行逆序排序
Stream<Integer> reversedStream = numberStream.reverseOrder();// 輸出 [5, 4, 3, 2, 1]
reversedStream.forEach(System.out::println);

4. 搜索

4.1 findAny

findAny 操作可以讓你從 Stream 流中找到任意一個元素,返回一個 Optional 對象,它可能包含一個值,也可能為空。這個操作通常用于并行的 Stream 流,因為它不保證返回第一個元素。例如:

// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");// 使用 findAny 操作找到任意一個元素
Optional<String> anyAnimal = animalStream.findAny();// 輸出 Optional[cat] 或者其他值
System.out.println(anyAnimal);

4.2 findFirst

findFirst 操作可以讓你從 Stream 流中找到第一個元素,返回一個 Optional 對象,它可能包含一個值,也可能為空。這個操作通常用于串行的 Stream 流,因為它保證返回第一個元素。例如:

// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");// 使用 findFirst 操作找到第一個元素
Optional<String> firstAnimal = animalStream.findFirst();// 輸出 Optional[cat]
System.out.println(firstAnimal);

4.3 anyMatch

anyMatch 操作可以讓你判斷 Stream 流中是否有任意一個元素滿足一個謂詞(Predicate),返回一個布爾值。例如:

// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");// 使用 anyMatch 操作判斷是否有以 f 開頭的元素
boolean hasF = animalStream.anyMatch(s -> s.startsWith("f"));// 輸出 true
System.out.println(hasF);

4.4 allMatch

allMatch 操作可以讓你判斷 Stream 流中是否所有的元素都滿足一個謂詞(Predicate),返回一個布爾值。例如:

// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");// 使用 allMatch 操作判斷是否所有的元素都包含 a
boolean allA = animalStream.allMatch(s -> s.contains("a"));// 輸出 false
System.out.println(allA);

4.5 noneMatch

noneMatch 操作可以讓你判斷 Stream 流中是否沒有任何一個元素滿足一個謂詞(Predicate),返回一個布爾值。例如:

// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");// 使用 noneMatch 操作判斷是否沒有以 z 結尾的元素
boolean noZ = animalStream.noneMatch(s -> s.endsWith("z"));// 輸出 true
System.out.println(noZ);

5. 截斷

5.1 takeWhile

takeWhile 操作可以讓你從 Stream 流中截取滿足一個謂詞(Predicate)的元素,直到遇到第一個不滿足的元素為止,返回一個新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用 takeWhile 操作截取小于 5 的元素
Stream<Integer> takenStream = numberStream.takeWhile(n -> n < 5);// 輸出 [1, 2, 3, 4]
takenStream.forEach(System.out::println);

5.2 dropWhile

dropWhile 操作可以讓你從 Stream 流中丟棄滿足一個謂詞(Predicate)的元素,直到遇到第一個不滿足的元素為止,然后返回剩余的元素組成的新的 Stream 流對象。例如:

// 創建一個 Stream 流對象
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用 dropWhile 操作丟棄小于 5 的元素
Stream<Integer> droppedStream = numberStream.dropWhile(n -> n < 5);// 輸出 [5, 6, 7, 8, 9, 10]
droppedStream.forEach(System.out::println);

6. 注意事項

6.1 只能被消費一次

一個Steam只能被消費(執行終端操作)一次。如果重復進行消費則會拋出IllegalStateException

// 創建一個 Stream 流對象
Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 正常執行
long count = wordStream.count();// 會拋出IllegalStateException
long anotherCount = wordStream.count();

6.2 并行流謹慎使用

Stream API 提供了并行流的支持,可以通過 parallel() 方法將順序流轉換為并行流。并行流是指可以利用多核處理器的優勢,將一個流的元素分成多個數據塊,然后用不同的線程并行地處理每個數據塊的流。使用并行流可以提高性能,但也有一些注意事項。

  • 并行流不一定總是比順序流快:并行流的性能受到很多因素的影響,比如數據源的可分割性,流的操作的計算成本,流的大小,硬件環境等。并行流會引入額外的開銷,比如線程的分配和切換,數據的拆分和合并等。因此,并行流不適合處理小量的數據,或者涉及裝箱拆箱,依賴前一個元素,有狀態的操作等。在使用并行流之前,最好先進行性能測試,比較并行流和順序流的效果,然后選擇合適的方式。
  • 并行流需要考慮線程安全問題:并行流會使用默認的 ForkJoinPool 線程池來執行任務,這個線程池的大小默認是 CPU 的核心數,也可以通過設置系統屬性 java.util.concurrent.ForkJoinPool.common.parallelism 來改變。如果并行流的操作涉及到共享變量的修改,或者調用了其他線程不安全的方法,就可能會導致數據的不一致或者錯誤。因此,在使用并行流時,要盡量避免產生副作用,或者使用線程安全的數據結構和方法,或者使用同步機制來保證線程安全。
  • 并行流可能會改變結果的順序或者內容:并行流會將數據分成多個塊,然后由不同的線程處理,這可能會導致結果的順序和數據源的順序不一致,或者結果的內容和數據源的內容不一致。例如,如果使用 findAny 操作在并行流中查找任意一個元素,可能會得到不同的結果,因為并行流不保證返回第一個元素。或者,如果使用 forEach 操作在并行流中遍歷元素,可能會得到亂序的結果,因為并行流不保證按照數據源的順序執行。因此,在使用并行流時,要注意選擇合適的操作,或者使用 sorted 或者 forEachOrdered 等操作來保證結果的順序。
// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");// 使用順序流計算所有元素的長度之和
int sum1 = animalStream.mapToInt(String::length).sum();
System.out.println(sum1); // 輸出 23// 使用并行流計算所有元素的長度之和
int sum2 = animalStream.parallel().mapToInt(String::length).sum();
System.out.println(sum2); // 輸出 23,和順序流相同,因為 sum 是一個無狀態的終端操作// 使用順序流查找任意一個以 f 開頭的元素
Optional<String> any1 = animalStream.filter(s -> s.startsWith("f")).findAny();
System.out.println(any1); // 輸出 Optional[fox]// 使用并行流查找任意一個以 f 開頭的元素
Optional<String> any2 = animalStream.parallel().filter(s -> s.startsWith("f")).findAny();
System.out.println(any2); // 輸出 Optional[fox] 或者 Optional[fox, giraffe],因為并行流不保證返回第一個元素// 使用順序流遍歷所有元素
animalStream.forEach(System.out::println); 
// 輸出 cat, dog, elephant, fox, giraffe,和數據源的順序相同// 使用并行流遍歷所有元素
animalStream.parallel().forEach(System.out::println); 
// 可能輸出 fox, dog, cat, elephant, giraffe,和數據源的順序不同,因為并行流不保證按照數據源的順序執行

6.3 惰性求值

Stream API 中間操作是惰性求值的,也就是說,它們不會立即執行,而是等到遇到一個終端操作時,才會觸發整個操作管道的執行。這樣可以提高性能,避免不必要的計算。例如:

// 創建一個 Stream 流對象
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);// 使用 filter 和 map 中間操作,但不會立即執行
Stream<Integer> transformedStream = numberStream.filter(n -> n % 2 == 0).map(n -> n * n);// 使用 forEach 終端操作,觸發中間操作的執行
transformedStream.forEach(System.out::println); // 輸出 4, 16

6.4 無狀態和有狀態

Stream API 中間操作可以分為無狀態和有狀態兩種,無狀態的操作是指不依賴于任何狀態,只和當前元素有關的操作,例如 filter, map, peek 等;有狀態的操作是指依賴于某些狀態,需要考慮整個 Stream 流的元素的操作,例如 distinct, sorted, limit, skip 等。無狀態的操作通常比有狀態的操作更高效,因為它們不需要維護額外的狀態,也不需要等待所有的元素都處理完畢。有狀態的操作可能會影響并行性能,因為它們需要同步狀態,或者等待所有的元素都到達。例如:

// 創建一個 Stream 流對象
Stream<String> animalStream = Stream.of("cat", "dog", "elephant", "fox", "giraffe");// 使用 filter 和 map 無狀態操作,可以并行執行
Stream<String> upperStream = animalStream.parallel().filter(s -> s.length() == 3).map(String::toUpperCase);// 使用 distinct 和 sorted 有狀態操作,需要同步狀態或者等待所有元素
Stream<String> uniqueStream = animalStream.parallel().distinct().sorted();

6.5 短路和非短路

Stream API 中間操作可以分為短路和非短路兩種,短路的操作是指不需要處理所有的元素,只要滿足某些條件就可以停止的操作,例如 limit, takeWhile, dropWhile 等;非短路的操作是指需要處理所有的元素,不能提前停止的操作,例如 filter, map, sorted 等。短路的操作通常比非短路的操作更高效,因為它們可以減少不必要的計算,也可以和一些短路的終端操作配合,例如 anyMatch, findFirst, findAny 等。非短路的操作可能會影響性能,因為它們需要處理所有的元素,也不能和一些短路的終端操作配合。例如:

// 創建一個 Stream 流對象
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);// 使用 limit 和 takeWhile 短路操作,可以提前停止
Stream<Integer> takenStream = numberStream.limit(5).takeWhile(n -> n < 4);// 使用 filter 和 map 非短路操作,需要處理所有元素
Stream<Integer> filteredStream = numberStream.filter(n -> n % 2 == 0).map(n -> n * n);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713845.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713845.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713845.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

動態規劃(算法競賽、藍橋杯)--分組背包DP

1、B站視頻鏈接&#xff1a;E16 背包DP 分組背包_嗶哩嗶哩_bilibili #include <bits/stdc.h> using namespace std; const int N110; int v[N][N],w[N][N],s[N]; // v[i,j]:第i組第j個物品的體積 s[i]:第i組物品的個數 int f[N][N]; // f[i,j]:前i組物品&#xff0c;能放…

學習JavaEE的日子 Day21 枚舉

Day21 1.枚舉的引入 需求&#xff1a;編寫季節類&#xff08;Season&#xff09;&#xff0c;該類只有四個對象&#xff08;spring&#xff0c;summer&#xff0c;autumn&#xff0c;winter&#xff09; 概念&#xff1a;枚舉&#xff08;enum&#xff09;全稱為 enumeration&…

基帶信號處理設計原理圖:2-基于6U VPX的雙TMS320C6678+Xilinx FPGA K7 XC7K420T的圖像信號處理板

基于6U VPX的雙TMS320C6678Xilinx FPGA K7 XC7K420T的圖像信號處理板 綜合圖像處理硬件平臺包括圖像信號處理板2塊&#xff0c;視頻處理板1塊&#xff0c;主控板1塊&#xff0c;電源板1塊&#xff0c;VPX背板1塊。 一、板卡概述 圖像信號處理板包括2片TI 多核DSP處理…

Linux進程管理:(二)進程調度原語

文章說明&#xff1a; Linux內核版本&#xff1a;5.0 架構&#xff1a;ARM64 參考資料及圖片來源&#xff1a;《奔跑吧Linux內核》 Linux 5.0內核源碼注釋倉庫地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 進程調度的概念比較簡單&#xff0c…

Java學習筆記NO.17

T1&#xff1a;合并兩個排序好的整數數組 import java.util.Arrays;public class MergeSortedArrays {public static int[] mergeArrays(int[] arr1, int[] arr2) {int[] result new int[arr1.length arr2.length];int i 0, j 0, k 0;while (i < arr1.length &&am…

一個簡單的iOS天氣應用程序源碼

創建一個簡單的iOS天氣應用程序涉及到多個步驟&#xff0c;包括設置項目、編寫代碼和使用外部API。由于篇幅限制&#xff0c;我將提供一個基礎的示例&#xff0c;這個例子會展示如何創建一個簡單的UI&#xff0c;獲取用戶的當前位置&#xff0c;并從OpenWeatherMap API獲取天氣…

QPS 提升 10 倍!滴滴借助 StarRocks 物化視圖實現低成本精確去重

作者&#xff1a;滴滴 OLAP 開發工程師 劉雨飛 小編導讀&#xff1a; 滴滴于 2022 年引入了 StarRocks。經過一年多的努力&#xff0c;StarRocks 逐漸替代了原有技術棧&#xff0c;成為滴滴內部主要的 OLAP 引擎。截至 2023 年 12 月&#xff0c;滴滴已經成功建立了超過 40 個 …

Cesium插件系列——3dtiles壓平

本系列為自己基于cesium寫的一套插件具體實現。 這里是根據Cesium提供的CustomShader來實現的。 在CustomShader的vertexShaderText里&#xff0c;需要定義vertexMain函數&#xff0c;例如下&#xff1a; struct VertexInput {Attributes attributes;FeatureIds featureIds;…

LVGL常用部件使用總結之圖片部件

圖片部件可用于顯示圖片&#xff0c;圖片源可以是 C 語言數組格式的文件、二進制的.bin 文件以及圖標字體。值得注意的是&#xff0c;圖片部件要顯示 BMP、JPEG 等格式的圖片&#xff0c;則必須經過解碼。 圖片部件的組成部分僅有一個&#xff1a;主體&#xff08;LV_PART_MAIN…

URI到底是個啥

URI是統一資源標識符&#xff08;Uniform Resource Identifier&#xff09;&#xff0c;URL是統一資源定位符&#xff08;Uniform Resource Locator&#xff09;。 具體如何標記和區分服務器上的資源用的其實就是URI&#xff0c;因為其經常出現在瀏覽器的地址欄里&#xff0c;…

Verilog(未完待續)

Verilog教程 這個教程寫的很好&#xff0c;可以多看看。本篇還沒整理完。 一、Verilog簡介 什么是FPGA&#xff1f;一種可通過編程來修改其邏輯功能的數字集成電路&#xff08;芯片&#xff09; 與單片機的區別&#xff1f;對單片機編程并不改變其地電路的內部結構&#xff0…

Parallel Computing - 一文講懂并行計算

目錄 Throughput/LatencySerial ComputingParallel ComputingTypes of parallel computersSimple 4-width SIMDAmdahls lawTypes of parallelism**Data Parallel Model**Task parallel PartitioningDomain DecompositionFunctional Decomposition CommunicationsExample that d…

java調用chatgpt接口,實現專屬于自己的人工智能助手

文章目錄 前言導包基本說明請求參數響應參數創建請求和響應的VO類 代碼編寫使用最后說明 前言 今天突然突發奇想&#xff0c;就想要用java來調用chatget的接口&#xff0c;實現自己的聊天機器人&#xff0c;但是網上找文章&#xff0c;屬實是少的可憐(可能是不讓發吧)。找到了…

ESP32 web 對接華為云平臺--MQTT協議

文章目錄 前言一、MQTT協議二、如何使用MQTT協議對接華為云1.注冊華為云賬號2.設備接入中創建資源空間3.如何連接4.通過MQTT.fx工具做初步對接4.1 設置連接信息4.2 連接平臺 5.查看平臺設備信息 三. 設備測對接平臺1.ESP測引入MQTT庫2.編碼2.1前端編碼修改2.2 后端接口修改 3.M…

element-plus+vue3表單含圖片(可預覽)(線上圖片)

一、要實現的效果&#xff1a; 二、如果期間出現這樣的效果&#xff08;表格穿透過來了&#xff09;&#xff0c;加上了這行代碼就可以了&#xff1a; preview-teleported“true” 如果僅測試用&#xff0c;建議使用線上圖片鏈接的形式&#xff0c;免得本地地址不生效&#xf…

SSH 的兩種認證方式

SSH&#xff08;Secure Shell&#xff09;提供了幾種不同的認證方式&#xff0c;其中兩種最常見的方式是密碼認證和密鑰認證。以下是它們的詳細介紹&#xff1a; 密碼認證&#xff1a; 原理&#xff1a;用戶在連接時輸入用戶名和密碼&#xff0c;然后將密碼傳輸到遠程服務器進行…

數學實驗-Matlab使用(1)

使用方法以及筆記均在文件中 class1_func1.m function f class1_func1(x) % f為輸出&#xff0c;輸出有多個時需要用中括號以矩陣的方式包起來 % x為輸入f sin(x)class1_func2.m function [a,b,u,v] class1_func2(x,y)[a,b] eig(x)[u,v] eig(y)class1.m % 當語句后有…

yolov9從頭開始訓練

yolov9從頭開始訓練 一、準備數據集 數據集相關文件存放布局如下 yolov9-datasets ├── train │ ├── images │ │ ├── image.jpg │ │ ├── │ └── labels │ ├── image.txt │ ├── ├── valid │ ├── images │ │ ├── image.jpg │ │ ├─…

吳恩達deeplearning.ai:模型選擇交叉驗證測試集的訓練方法

以下內容有任何不理解可以翻看我之前的博客哦&#xff1a;吳恩達deeplearning.ai專欄 在上一節中&#xff0c;我們了解了如何利用測試集來評估模型性能。今天我們來進一步完善這個想法&#xff0c;讓你使用該技術自動選擇一個更好的模型。 文章目錄 模型選擇交叉驗證 Cross Va…

SpringBoot 框架(上)

SpringBoot SpringBoot概述依賴管理自動配置SpringBoot 注解使用ConfigurationImport(value {Cat.class,Dog.class})ImportResource(locations "classpath:beans.xml") yaml 標記語言概述基本語法數據類型字面量對象數組 使用細節 Rest 風格請求處理概述注意事項 接…