摘要:前置數據提取對象中的一列提取列第一種寫法簡單一點的寫法通過字段中條件過濾集合列表只要年紀大于歲的人列表中對象數值型列數據求和求和全部年紀取出集合符合條件的第一個元素取出年紀為歲的人簡寫對集合中對象
0x00. 前置數據
private List0x01. 提取對象中的一列peoples = null; @BeforeEach void before () { peoples = new ArrayList<>(); peoples.add(new People("K.O1", 21, new Date())); peoples.add(new People("K.O3", 23, new Date())); peoples.add(new People("K.O4", 24, new Date())); peoples.add(new People("K.O5", 25, new Date())); peoples.add(new People("K.O2", 22, new Date())); peoples.add(new People("K.O6", 26, new Date())); }
/** * 提取1列 */ @Test void whenExtractColumnSuccess () { //第一種寫法 Listages1 = peoples.stream().map(people -> people.getAge()).collect(Collectors.toList()); System.out.println("###println: args1----"); ages1.forEach(System.out::println); //簡單一點的寫法 List ages2 = peoples.stream().map(People::getAge).collect(Collectors.toList()); System.out.println("###println: args2----"); ages1.forEach(System.out::println); }
###println: args1---- 21 22 23 24 25 26 ###println: args2---- 21 22 23 24 25 260x02. 通過字段中條件過濾集合列表
/** * 只要年紀大于25歲的人 */ @Test void whenFilterAgeGT25Success () { Listpeoples1 = peoples.stream().filter(x -> x.getAge() > 25).collect(Collectors.toList()); peoples1.forEach(x -> System.out.println(x.toString())); }
People{name="K.O6", age=26, birthday=Wed May 15 22:20:22 CST 2019}0x03. 列表中對象數值型列數據求和
/** * 求和全部年紀 */ @Test void sumAllPeopleAgeSuccess () { Integer sum1 = peoples.stream().collect(Collectors.summingInt(People::getAge)); System.out.println("###sum1: " + sum1); Integer sum2 = peoples.stream().mapToInt(People::getAge).sum(); System.out.println("###sum2: " + sum2); }
###sum1: 141 ###sum2: 1410x04. 取出集合符合條件的第一個元素
/** * 取出年紀為25歲的人 */ @Test void extractAgeEQ25Success () { OptionaloptionalPeople = peoples.stream().filter(x -> x.getAge() == 25).findFirst(); if (optionalPeople.isPresent()) System.out.println("###name1: " + optionalPeople.get().getName()); //簡寫 peoples.stream().filter(x -> x.getAge() == 25).findFirst().ifPresent(x -> System.out.println("###name2: " + x.getName())); }
###name1: K.O5 ###name2: K.O50x05. 對集合中對象字符列按規則拼接
/** * 逗號拼接全部名字 */ @Test void printAllNameSuccess () { String names = peoples.stream().map(People::getName).collect(Collectors.joining(",")); System.out.println(names); }
K.O1,K.O2,K.O3,K.O4,K.O5,K.O60x06. 將集合元素提取,轉為Map
/** * 將集合轉成(name, age) 的map */ @Test void list2MapSuccess () { Mapmap1 = peoples.stream().collect(Collectors.toMap(People::getName, People::getAge)); map1.forEach((k, v) -> System.out.println(k + ":" + v)); System.out.println("--------"); //(name object) Map map2 = peoples.stream().collect(Collectors.toMap(People::getName, People::getThis)); map2.forEach((k, v) -> System.out.println(k + ":" + v.toString())); } //People中自己實現的方法 public People getThis () { return this; }
K.O2:22 K.O3:23 K.O1:21 K.O6:26 K.O4:24 K.O5:25 -------- K.O2:People{name="K.O2", age=22, birthday=Wed May 15 22:42:39 CST 2019} K.O3:People{name="K.O3", age=23, birthday=Wed May 15 22:42:39 CST 2019} K.O1:People{name="K.O1", age=21, birthday=Wed May 15 22:42:39 CST 2019} K.O6:People{name="K.O6", age=26, birthday=Wed May 15 22:42:39 CST 2019} K.O4:People{name="K.O4", age=24, birthday=Wed May 15 22:42:39 CST 2019} K.O5:People{name="K.O5", age=25, birthday=Wed May 15 22:42:39 CST 2019}0x07. 按集合某一屬性進行分組
/** * 按名字分組 */ @Test void listGroupByNameSuccess() { //添加一個元素方便看效果 peoples.add(new People("K.O1", 29, new Date())); Map> map = peoples.stream().collect(Collectors.groupingBy(People::getName)); map.forEach((k, v) -> System.out.println(k + ":" + v.size())); }
K.O2:1 K.O3:1 K.O1:2 K.O6:1 K.O4:1 K.O5:10x08. 求集合對象數值列平均數
/** * 求人平均年齡 */ @Test void averagingAgeSuccess () { Double avgAge = peoples.stream().collect(Collectors.averagingInt(People::getAge)); System.out.println(avgAge); }
23.50x09. 對集合按某一列排序
/** * 按年齡排序 */ @Test void sortByAgeSuccess () { System.out.println("###排序前---"); peoples.forEach(x -> System.out.println(x.getAge())); peoples.sort((x, y) -> { if (x.getAge() > y.getAge()) { return 1; } else if (x.getAge() == y.getAge()) { return 0; } return -1; }); System.out.println("###排序后---"); peoples.forEach(x -> System.out.println(x.getAge())); }
###排序前--- 21 23 24 25 22 26 ###排序后--- 21 22 23 24 25 26未完待續
<源碼地址:https://github.com/cos2a/learning-repo/tree/master/core-java8>
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/77700.html
摘要:串行與并行可以分為串行與并行兩種,串行流和并行流差別就是單線程和多線程的執行。返回串行流返回并行流和方法返回的都是類型的對象,說明它們在功能的使用上是沒差別的。唯一的差別就是單線程和多線程的執行。 Stream是什么 Stream是Java8中新加入的api,更準確的說: Java 8 中的 Stream 是對集合(Collection)對象功能的增強,它專注于對集合對象進行各種非常便...
摘要:新特性總覽標簽本文主要介紹的新特性,包括表達式方法引用流默認方法組合式異步編程新的時間,等等各個方面。還有對應的和類型的函數連接字符串廣義的歸約匯總起始值,映射方法,二元結合二元結合。使用并行流時要注意避免共享可變狀態。 Java8新特性總覽 標簽: java [TOC] 本文主要介紹 Java 8 的新特性,包括 Lambda 表達式、方法引用、流(Stream API)、默認方...
摘要:比如對一個數據流進行過濾映射以及求和運算,通過使用延后機制,那么所有操作只要遍歷一次,從而減少中間調用。這里需知道中的元素都是延遲計算的,正因為此,能夠計算無限數據流。 【編者按】在之前文章中,我們介紹了 Java 8和Scala的Lambda表達式對比。在本文,將進行 Hussachai Puripunpinyo Java 和 Scala 對比三部曲的第二部分,主要關注 Stream...
摘要:運行機制分為源,中間操作,終止操作。反過來說,目前還無法專為某個并行流指定這個值。我們在本節中已經指出,并行流不總是比順序流快。特別是和等依賴于元素順序的操作,它們在并行流上執行的代價非常大。1 Stream Stream是一組用來處理數組,集合的API。 1.1 特性 不是數據結構,沒有內部存儲。 不支持索引訪問。 延遲計算 支持并行 很容易生成數據或集合 支持過濾,查找,轉換,匯總,...
摘要:簡而言之,提供了一種高效且易于使用的處理數據的方式。和以前的操作不同,操作還有兩個基礎的特征中間操作都會返回流對象本身。注意自己不會存儲元素不會改變源對象,相反,它們會返回一個持有結果的新操作時延遲執行的。為集合創建并行流。 1. 概述 1.1 簡介 Java 8 中有兩大最為重要的改革,第一個是 Lambda 表達式,另外一個則是 Stream API(java.util.strea...
閱讀 2019·2023-04-26 02:15
閱讀 2302·2021-11-19 09:40
閱讀 1038·2021-10-27 14:13
閱讀 3307·2021-08-23 09:44
閱讀 3609·2019-12-27 12:24
閱讀 652·2019-08-30 15:53
閱讀 1164·2019-08-30 10:53
閱讀 2153·2019-08-26 12:14