轉載:https://www.bilibili.com/video/BV1VQ4y1P7Fq?spm_id_from=333.1007.top_right_bar_window_history.content.click
概念
Stream是Java8 API的新成員,它允許以宣告性方式處理資料集合 ,
特點
(1)代碼簡潔:函式式編程寫出的代碼簡潔且意圖明確,使用stream介面讓你從此告別for回圈,
(2)多核友好:Java函式式編程使得撰寫并行程式從未如此簡單,你需要的全部就是呼叫一下方法,
流程
1)第一步:把集合轉換為流stream
2)第二步:操作stream流
stream流在管道中經過中間操作(intermediate operation)的處理,最后由最終操作(terminal operation)得到前面處理的結果
運算子
兩種:中間運算子、終止運算子
中間運算子
| 流方法 | 含義 | 示例 |
|---|---|---|
| filter | 用于通過設定的條件過濾出元素 | List |
| distinct | 回傳一個元素各異(根據流所生成元素的hashCode和equals方法實作)的流, | List |
| limit | 會回傳一個不超過給定長度的流, | List |
| skip | 回傳一個扔掉了前n個元素的流, | List |
| map | 接受一個函式作為引數,這個函式會被應用到每個元素上,并將其映射成一個新的元素(使用映射一詞,是因為它和轉換類似,但其中的細微差別在于它是“創建一個新版本”而不是去“修改”), | List |
| flatMap | 使用flatMap方法的效果是,各個陣列并不是分別映射成一個流,而是映射成流的內容,所有使用map(Arrays::stream)時生成的單個流都被合并起來,即扁平化為一個流, | List |
| sorted | 回傳排序后的流 | List |
示例代碼:
1)filter
/** * 功能描述:根據條件過濾集合資料 * @return : void */ @Test public void filter(){ List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl"); List<String> filtered = strings.stream().filter(string -> !string.isEmpty()).collect(Collectors.toList()); out.println(filtered); }2)distinct
/** * 功能描述:去除集合中重復資料 * @return : void */ @Test public void distinct(){ List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl"); List<String> distincted = strings.stream().distinct().collect(Collectors.toList()); out.println(distincted); }3)limit
/** * 功能描述:指定獲取集合前x條資料,重新構造一個新的集合 * @return : void */ @Test public void limit(){ List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl"); List<String> limited = strings.stream().limit(3).collect(Collectors.toList()); out.println(limited); }4)skip
/** * 功能描述:排除集合前x條資料,把后面的資料重新構造一個新的集合 * @return : void */ @Test public void skip(){ List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl"); List<String> skiped = strings.stream().skip(3).collect(Collectors.toList()); out.println(skiped); }5)map
/** * 功能描述:對集合中所有元素統一處理 * @return : void */ @Test public void map(){ List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl"); List<String> mapped = strings.stream().map(str->str+"-itcast").collect(Collectors.toList()); out.println(mapped); }6)flatMap
/** * 功能描述:對集合中所有元素統一處理 * @return : void */ @Test public void flatMap(){ List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl"); Stream<String> stringStream = strings.stream().map(x -> x); Stream<String> stringStream1 = strings.stream().flatMap(x -> Arrays.asList(x.split(" ")).stream()); }7)sorted
/** * 功能描述 : 對集合進行排序 * @return : void */ @Test public void sorted(){ List<String> strings1 = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl"); List<String> strings2 = Arrays.asList("張三", "李四", "王五", "趙柳", "張哥","李哥", "王哥"); List<Integer> strings3 = Arrays.asList(10, 2, 30, 22, 1,0, -9); List<String> sorted1 = strings1.stream().sorted().collect(Collectors.toList()); List<String> sorted2 = strings2.stream().sorted(Collections.reverseOrder(Collator.getInstance(Locale.CHINA))).collect(Collectors.toList()); List<Integer> sorted3 = strings3.stream().sorted().collect(Collectors.toList()); out.println(sorted1); out.println(sorted2); out.println(sorted3); }Map、flatMap區別
map:對流中每一個元素進行處理
flatMap:流扁平化,讓你把一個流中的“每個值”都換成另一個流,然后把所有的流連接起來成為一個流
總結:map是對一級元素進行操作,flatmap是對二級元素操作,
本質區別:map回傳一個值;flatmap回傳一個流,多個值,
應用場景:map對集合中每個元素加工,回傳加工后結果;flatmap對集合中每個元素加工后,做扁平化處理后(拆分層級,放到同一層)然后回傳
/**
* 方法一
* 功能描述: 通過使用map、flatMap把字串轉換為字符輸出對比區別
* @return : void
*/
@Test
public void flatMap2Map(){
List<String> strings = Arrays.asList("abc", "abc", "bc", "efg", "abcd","jkl", "jkl");
final Stream<Character> flatMap = strings.stream().flatMap(Java8StreamTest::getCharacterByString);
flatMap.forEach(System.out::println);
//----------------------------------------------
final Stream<Stream<Character>> mapStream = strings.stream().map(Java8StreamTest::getCharacterByString);
//mapStream.forEach(System.out::println);
out.println("------------------------------------------------");
mapStream.forEach(stream-> {stream.forEach(character->{System.out.println(character);});});
}
公共方法(字串轉換為字符流)
/**
* 功能描述:字串轉換為字符流
* @param str
* @return : java.util.stream.Stream<java.lang.Character>
*/
public static Stream<Character> getCharacterByString(String str) {
List<Character> characterList = new ArrayList<>();
for (Character character : str.toCharArray()) {
characterList.add(character);
}
return characterList.stream();
}
終止運算子
| 流方法 | 含義 | 示例 |
|---|---|---|
| anyMatch | 檢查是否至少匹配一個元素,回傳boolean, | List |
| allMatch | 檢查是否匹配所有元素,回傳boolean, | List |
| noneMatch | 檢查是否沒有匹配所有元素,回傳boolean, | List |
| findAny | 將回傳當前流中的任意元素, | List |
| findFirst | 回傳第一個元素 | List |
| forEach | 遍歷流 | List |
| collect | 收集器,將流轉換為其他形式, | List |
| reduce | 可以將流中元素反復結合起來,得到一個值, | List |
| count | 回傳流中元素總數, | List |
示例代碼
1)anyMatch
/** * 功能描述 : 判斷集合中是否至少存在一個元素滿足條件 * @return : void */ @Test public void anyMatch(){ List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl"); boolean b = strings.stream().anyMatch(s -> s == "abc"); out.println(b); }2)allMatch
/** * 功能描述 : 判斷集合中是否所有元素都滿足條件 * @return : void */ @Test public void allMatch(){ List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl"); boolean b = strings.stream().allMatch(s -> s == "abc"); out.println(b); }3)noneMatch
/** * 功能描述 : 判斷集合中是否所有元素都不滿足條件 * @return : void */ @Test public void noneMatch(){ List<String> strings = Arrays.asList("abc", "abd", "aba", "efg", "abcd","jkl", "jkl"); boolean b = strings.stream().noneMatch(s -> s == "abc"); out.println(b); }4)findAny
/** * 功能描述 : 回傳當前流中任意元素 * @return : void */ @Test public void findAny(){ List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl"); Optional<String> any = strings.stream().findAny(); if(any.isPresent()) out.println(any.get()); }5)findFirst
/** * 功能描述 : 回傳當前流中第一個元素 * @return : void */ @Test public void findFirst(){ List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl"); Optional<String> first = strings.stream().findFirst(); if(first.isPresent()) out.println(first.get()); }6)forEach java
/** * 功能描述 : 遍歷流 * @return : void */ @Test public void foreach(){ List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl"); strings.stream().forEach(s -> out.println(s)); }7)collect
/** * 功能描述 : 流轉換為其他形式 * @return : void */ @Test public void collect(){ List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl"); Set<String> set = strings.stream().collect(Collectors.toSet()); List<String> list = strings.stream().collect(Collectors.toList()); Map<String, String> map = strings.stream().collect(Collectors.toMap(v ->v.concat("_name"), v1 -> v1, (v1, v2) -> v1)); out.println(set); out.println(list); out.println(map); }8)reduce
/** * 功能描述 : 將流中元素反復結合起來,得到一個值 * @return : void */ @Test public void reduce(){ List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl"); //reduce方法一 Optional<String> reduce1 = strings.stream().reduce((acc,item) -> {return acc+item;}); //reduce方法二 String reduce2 = strings.stream().reduce("itcast", (acc, item) -> { return acc + item; }); //reduce方法三 ArrayList<String> reduce3 = strings.stream().reduce( new ArrayList<String>(), new BiFunction<ArrayList<String>, String, ArrayList<String>>() { @Override public ArrayList<String> apply(ArrayList<String> acc, String item) { acc.add(item); return acc; } }, new BinaryOperator<ArrayList<String>>() { @Override public ArrayList<String> apply(ArrayList<String> acc, ArrayList<String> item) { return acc; } } ); if(reduce1.isPresent())out.println(reduce1.get()); out.println(reduce2); out.println(reduce3); }9)count
/** * 功能描述 : 回傳流中元素總數 * @return : void */ @Test public void count(){ List<String> strings = Arrays.asList("cv", "abd", "aba", "efg", "abcd","jkl", "jkl"); long count = strings.stream().count(); out.println(count); }
注意:文章中因排序部分用到外部比較器,需要匯入外部jar包
<!--apache集合操作工具包-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
<version>4.4</version>
</dependency>
我是阿廷,一個相信努力可以改變人生的人,我相信一切的上進行為都是值得的,至少可以讓我看見更大的世界,
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/473400.html
標籤:Java
上一篇:Mybatis的簡單注解
