歡迎關注公衆號【 Ccww筆記】,原創技術文章第一時間推出「致"高級"工程師(BUG工程師)
一顆折騰的心
原創不易,點個贊💗,支持支持segmentfault
往期文章:安全
在開發中的代碼是否是很常見這樣的代碼:數據結構
for循環取元素取值多線程
List<User> szUserList = new ArrayList<>(); for (User user : userList) { if (user.getAddress().equals("shenzhen")) { szUserList.add(user); } }
for循環去重函數
for (int i = 0; i < list.size() - 1; i++) { for (int j = list.size() - 1; j > i; j--) { if (list.get(j).equals(list.get(i))) { list.remove(j); } } }
Set set = new HashSet(); List<String> newList = new ArrayList(); for (Iterator iter = list.iterator(); iter.hasNext();) { Object element = iter.next(); if (set.add(element)) newList.add(element); } list.clear(); list.addAll(newList); }
對於普通的CV族來講,這樣就差很少了,功能實現了,又能夠收拾包袱準備下班了.完美!!!spa
但對於咱們"高級"CV族來,這不夠,這遠遠的不夠,咱們須要保持一顆折騰的心💗,這樣的代碼彰顯不出咱們這段位的價值(青銅😀王者).線程
因此咱們須要一種方式去提高咱們代碼的維度,讓咱們的代碼變得更"高級", 使代碼更加簡潔而且更加語義化 .code
因爲"高級"CV"族保持這樣的心態:排序
平凡的人,平凡的生活,平凡的工做該有一顆不平凡的心💗接口
找出一種方式能夠很好的升級這種代碼問題:
Java 8 新提供給開發者的一組操做集合的 API----Stream 流
首先咱們來看看Stream流處理for循環取元素取值:
List<User> szUserList=userList.stream() .filter(user-> user.getAddress().equals("shenzhen")) .collect(Collectors.toList());
其實, stream流會把須要處理的元素集合看做一種流, 流在管道中傳輸, 而且能夠在管道的節點上進行處理, 好比篩選、排序、聚合等。Stream 流能夠極大的提升開發效率,也可使用它寫出更加簡潔明瞭的代碼。
那麼Stream流能夠分幾種:
在使用並行流的時候就要注意線程安全的問題
元素流在管道中通過中間操做(intermediate operation)的處理,最後由終端操做 (terminal operation) 獲得前面處理的結果。
中間操做(intermediate operation): 中間操做會產生另外一個流 ,( 流是一種惰性操做,全部對源數據的計算只在終止操做被初始化的時候纔會執行), 並且中間操做還分無狀態操做和有狀態操做兩種 .
List< String> createStream = new ArrayList< String>(); // 順序流 Stream< String> stream = createStream.stream(); // 並行流 Stream< String> parallelStream = createStream.parallelStream(); // of()方法建立 Stream< String> stringStream = Stream.of( createStream.toArray(new String[createStream.size()]));
中間操做包括map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、 unordered等.
經常使用操做解析:
Stream
流中的元素去重後,返回一個新的流。終止操做包括:forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 iterator等
經常使用操做解析:
Stream
流中是否有任何符合要求的元素,若是有則返回 ture
,沒有返回 false
。(終端操做)Stream操做均可以按照通常步驟進行.
好比上面的去重操做:
distinct操做:
list=list.stream() .distinct() .collect(Collectors.toList());
NOTE:distinct()
使用hashCode()
和eqauls()
方法來獲取不一樣的元素。所以,須要去重的類必須實現hashCode()
和equals()
方法
結合filter,distinct,peek,skip,limit,collect例子:
List arrList = userList.stream().filter(user -> user.getName().equals("ccww"))//過濾 .distinct()//去重 .peek(user -> user.setAddress("shenzhen"))//從新賦值 .skip(2)//跳讀 .limit(2)//讀取2個元素 .collect(Collectors.toList());
map的例子:
List arrList1=userList.stream() .map(user->{ //todo 處理函數 user.setAddress(cityService.getCity()); }).collect(Collectors.toList()); }
如今咱們主要了解了 Java 8 Stream 流的基礎知識及使用,涵蓋 Stream 流的分類、接口、相關 API 操做使用, 在實際開發中,必定還會有更多的應用,更多Stream詳細內容,會在接下來好好文章中..
各位看官還能夠嗎?喜歡的話,動動手指點個贊💗,點個關注唄!!謝謝支持!也歡迎關注公衆號【Ccww筆記】,原創技術文章第一時間推出