Stream常用操作

Stream 操作的 總覽詳解: https://www.ibm.com/developerworks/cn/java/j-lo-java8streamapi/

Stream的特點

  • 惰性化:惰性化的操作意思是,在執行Intermediate操作時,不立馬執行,而是把這些函數放起來,當在執行Terminal操作時,一起執行Intermediate操作
  • 支持並行化操作
  • Stream流是單向的,不可往復的

流的操作類型

Intermediate(中間操作):中間操作時惰性(lazy)的,執行指定的操作後,返回一個新的Stream流。後面還可以繼續接着操作流。

Terminal(終端操作):當使用Terminal操作後,流就結束了,後面不能再繼續操作流,這是流的最後一個操作。

Stream操作

1.map 返回由指定函數應用於stream流的元素的結果 組成的流,即流中的每個元素都執行操作,然後返回執行操作後的元素再組成一個流,並且返回它。

map 生成的是個 1:1 映射,每個輸入元素,都按照規則轉換成爲另外一個元素

Stream<T> map(Function<? super T,? extends R> mapper)

舉個例子:

//這裏返回的的是imgs2的List過濾後的所有ImageUrl流,並且使用collect()
shopInfoDto.setLicenseImgs(imgs2.stream().map(p->p.getImageUrl()).
collect(Collectors.toList()));

//轉換爲大寫
List<String> output = wordList.stream().
map(String::toUpperCase).
collect(Collectors.toList());

//平方數
List<Integer> nums = Arrays.asList(1, 2, 3, 4);
List<Integer> squareNums = nums.stream().
map(n -> n * n).
collect(Collectors.toList());

2.filter:過濾出 滿足Lamda表達式predicate元素的的流
Stream<T> filter(Predicate<? super T> predicate) 

舉個例子

List<BagOrderEntity> expArrivalList = waitDepositeList.stream()
.filter(s -> s.getExpArrivalTime().after(time))
.collect(Collectors.toList());
3.peek:返回由該流的元素組成的流,另外在從生成的流中消耗元素時對每個元素執行提供的操作。
Stream<T> peek(Consumer<? super T> action)

舉個例子

<!--該方法主要用於支持調試,您希望在流程中流過某個特定點時查看元素:-->
   Stream.of("one", "two", "three", "four") 
   .filter(e -> e.length() > 3) 
   .peek(e -> System.out.println("Filtered value: " + e)) 
   .map(String::toUpperCase) 
   .peek(e -> System.out.println("Mapped value: " + e)) .collect(Collectors.toList());  
4.forEach:遍歷元素。接收一個Lamda表達式,Stream流中每個元素,執行Lamda表達式方法中的操作。

注意:forEach 不能修改自己包含的本地變量值,也不能用 break/return 之類的關鍵字提前結束循環。並且foreach是Terminal操作,執行到這個方法,流已經結束啦!=

void forEach(Consumer<? super T> action) 

舉個例子:

roster.stream()
 .filter(p -> p.getGender() == Person.Sex.MALE)
 .forEach(p -> System.out.println(p.getName()));

peek: 可以到達遍歷的效果,但是peek是屬於Intermediate操作的,執行遍歷操作以後,還會返回一個新的Stream流

Stream.of("one", "two", "three", "four")
 .filter(e -> e.length() > 3)
 .peek(e -> System.out.println("Filtered value: " + e))
 .map(String::toUpperCase)
 .peek(e -> System.out.println("Mapped value: " + e))
 .collect(Collectors.toList());
5.sorted : 對 Stream 的排序通過 sorted 進行
Stream<T> sorted()

//使用特定的比較器來排序
Stream<T> sorted(Comparator<? super T> comparator)

優點:相對於數組排序:它比數組的排序更強之處在於你可以首先對 Stream 進行各類 map、filter、limit、skip 甚至 distinct 來減少元素數量後,再排序,這能幫助程序明顯縮短執行時間

舉個例子

List<Person> persons = new ArrayList();
 for (int i = 1; i <= 5; i++) {
 Person person = new Person(i, "name" + i);
 persons.add(person);
 }
List<Person> personList2 = persons.stream().limit(2).sorted((p1, p2) -> p1.getName().compareTo(p2.getName())).collect(Collectors.toList());
System.out.println(personList2);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章