1. 程式人生 > 程式設計 >Java Stream流知識總結

Java Stream流知識總結

說明

在Java 8中,得益於Lambda所帶來的函數語言程式設計,引入了一個全新的Stream概念,用於解決已有集合類庫既有的弊端

遍歷

傳統集合在於使用迴圈遍歷

Java 8的Lambda讓我們可以更加專注於做什麼(What),而不是怎麼做(How),這點此前已經結合內部類進行 了對比說明。現在,我們仔細體會一下上例程式碼,可以發現:

  • for迴圈的語法就是“怎麼做”
  • for迴圈的迴圈體才是“做什麼”

傳統集合遍歷

import java.util.ArrayList;
import java.util.List;

/**
 * @author tanglei
 * @date 2020/6/10 10:21 下午
 */
public class NormalFilter {
 public static void main(String[] args) {
  List<String> list = new ArrayList<>();
  list.add("張無忌");
  list.add("周芷若");
  list.add("趙敏");
  list.add("張強");
  list.add("張三丰");

  List<String> zhangList = new ArrayList<>();
  for(String name : list){
   if(name.startsWith("張")){
    zhangList.add(name);
   }
  }

  List<String> shortList = new ArrayList<>();
  for(String name : zhangList){
   if(name.length() == 3){
    shortList.add(name);
   }
  }

  for (String name : shortList){
   System.out.println(name);
  }
 }
}


Stream的優雅

import java.util.ArrayList;
import java.util.List;

/**
 * @author tanglei
 * @date 2020/6/10 10:28 下午
 */
public class StreamFilter {
 public static void main(String[] args) {
  List<String> list = new ArrayList<>();
  list.add("張無忌");
  list.add("周芷若");
  list.add("趙敏");
  list.add("張強");
  list.add("張三丰");

  list.stream()
    .filter(s -> s.startsWith("張"))
    .filter(s -> s.length() == 3)
    .forEach(System.out::println);
 }
}

Stream的優雅使用stream可以十分簡單明瞭的體現程式碼的邏輯

“Stream流”其實是一個集合元素的函式模型,它並不是集合,也不是資料結構,其本身並不儲存任何 元素(或其地址值

獲取流

  • 所有的 Collection 集合都可以通過 stream 預設方法獲取流;
  • Stream 介面的靜態方法 of 可以獲取陣列對應的流。

根據Collection獲取流

public static void main(String[] args) {
	List<String> list = new ArrayList<>();
	Stream<String> stream1 = list.stream();
	Set<String> set = new HashSet<>();
	Stream<String> stream2 = set.stream();
	Vector<String> vector = new Vector<>();
}

根據Map獲取流

public static void main(String[] args) {
	Map<String,String> map = new HashMap<>();
	Stream<String> keyStream = map.keySet().stream();
	Stream<String> valueStream = map.values().stream(); 	Stream<Map.Entry<String,String>> entryStream = 		map.entrySet().stream();
}

根據陣列獲取流

public static void main(String[] args) {
	String[] array = { "張無忌","張翠山","張三丰","張一元" };
	Stream<String> stream = Stream.of(array); 
}

常用方法

逐一處理:forEach
會將每一個流元素交給該函式進行處理

public static void main(String[] args) {
	Stream<String> stream = Stream.of("張無忌","周芷若");
	stream.forEach(name‐> System.out.println(name)); 
}

過濾:filter
可以通過 filter 方法將一個流轉換成另一個子集流

public static void main(String[] args) {
	Stream<String> original = Stream.of("張無忌","周芷若");
	Stream<String> result = original.filter(s ‐> 	s.startsWith("張")); 
}

對映:map
如果需要將流中的元素對映到另一個流中

public static void main(String[] args) {
	Stream<String> original = Stream.of("10","12","18");
	Stream<Integer> result = original.map(str‐>Integer.parseInt(str)); 
}

統計個數:count
數一數其中的元素個數

public static void main(String[] args) {
	Stream<String> original = Stream.of("張無忌","周芷若"); 
 Stream<String> result = original.filter(s ‐> s.startsWith("張"));
 System.out.println(result.count()); // 2
}

取用前幾個:limit
可以對流進行擷取,只取用前n個

public static void main(String[] args) {
	Stream<String> original = Stream.of("張無忌","周芷若"); 
 Stream<String> result = original.limit(2); 	
 System.out.println(result.count()); // 2
}

跳過前幾個:skip
如果希望跳過前幾個元素

public static void main(String[] args) {
	Stream<String> original = Stream.of("張無忌","周芷若"); 
 Stream<String> result = original.skip(2); 
 System.out.println(result.count()); // 1
}

組合:concat
如果有兩個流,希望合併成為一個流

public static void main(String[] args) {
	Stream<String> streamA = Stream.of("張無忌"); 	
 Stream<String> streamB = Stream.of("張翠山"); 
 Stream<String> result = Stream.concat(streamA,streamB);
}

感謝

黑馬程式設計師

以及勤勞的自己

以上就是Java Stream流知識總結的詳細內容,更多關於Java Stream流的資料請關注我們其它相關文章!