Stream流(jdk新特性)
阿新 • • 發佈:2019-02-14
Stream流
- java8,通過Lambda表示式引入
獲取流物件
java.util.stream.Stream是Java 8新加入的最常用的流介面。(這並不是一個函式式介面。)
獲取一個流非常簡單,有以下幾種常用的方式:
- 所有的Collection集合都可以通過stream預設方法獲取流;
- java.util.Map介面不是Collection的子介面,且其K-V資料結構不符合流元素的單一特徵,所以獲取對應的流需要分key、value或entry等情況:
- Stream介面的靜態方法of可以獲取陣列對應的流。
### ==通過Collection集合獲取流物件==
- 首先,java.util.Collection介面中加入了default方法stream用來獲取流,所以其所有實現類均可獲取流。
public class Collection2Stream(){
//collection集合
Collection c = new Collection();
Stream stream1 = c.stream();
//List集合
List<String> list = new ArrayList<>();
Stream<String> stream2 = list.stream();
//Set集合
Set<String> set = new HashSet<> ();
Stream<String> stream3 = set.stream();
//Map集合
HashMap<String,String> map = new HashMap<>();
//1.keyset集合
Stream<String> stream1 = map.keySet().stream();
//2. values
Stream<Integer> stream2 = map.values().stream();
// 3. entrySet
Stream< Map.Entry<String, Integer>> stream3 = map.entrySet().stream();
}
根據Map獲取流
public class Map2Stream(){
//Map集合
HashMap<String,String> map = new HashMap<>();
//1.keyset集合
Stream<String> stream1 = map.keySet().stream();
//2. values
Stream<Integer> stream2 = map.values().stream();
// 3. entrySet
Stream<Map.Entry<String, Integer>> stream3 = map.entrySet().stream();
}
根據陣列獲取流
- 如果使用的不是集合或對映而是陣列,由於陣列物件不可能新增預設方法,所以Stream介面中提供了靜態方法of,使用很簡單:
public class Array2Stream(){
String[] array = { "張無忌", "張翠山", "張三丰", "張一元" };
// Stream 類的靜態方法 : of
Stream<String> stream = Stream.of(array);
System.out.println("stream = " + stream);
}
Stream流的常用API
- 在上述介紹的各種方法中,凡是返回值仍然為Stream介面的為函式拼接方法,它們支援鏈式呼叫;而返回值不再為Stream介面的為終結方法,不再支援鏈式呼叫。如下表所示:
方法名 | 方法作用 | 方法種類 | 是否支援鏈式呼叫 |
---|---|---|---|
count | 統計個數 | 終結 | 否 |
forEach | 逐一處理 | 終結 | 否 |
filter | 過濾 | 函式拼接 | 是 |
limit | 取前幾個 | 函式拼接 | 是 |
skip | 跳過前幾個 | 函式拼接 | 是 |
map | 對映 | 函式拼接 | 是 |
contact | 組合 | 函式拼接 | 是 |
流API的使用
逐一處理:forEach
- void forEach(Consumer
統計個數:count
- 返回值為long型別
void forEach(Consumer<? super T> action);
該方法接收一個Consumer介面函式,會將每一個流元素交給該函式進行處理。例如:
import java.util.stream.Stream;
public class Test1 {
public static void main(String[] args) {
Stream<String> stream = Stream.of("張無忌", "張學友", "劉德華", "張三丰");
// void forEach(Consumer<? super T> action);
stream.forEach(System.out::println);
//返回值為long
long count = stream.count();
}
}
過濾:filter
- Stream filter(Predicate
取前幾個:limit
- Stream limit(long maxSize);
跳過前幾個:skip
- Stream skip(long n);
public class Test1 {
public static void main(String[] args) {
Stream<String> stream = Stream.of("張無忌", "張學友", "劉德華", "張三丰");
stream.filter(name->name.startsWith("張"))
.limit(2)
.forEach(System.out::println);
}
}
對映:map
- `<R> Stream<R> map(Function<? super T, ? extends R> mapper);`
- 該介面需要一個Function函式式介面引數,可以將當前流中的 T 型別資料轉換為另一種 R 型別的流。
import java.util.stream.Stream;
public class Test1 {
public static void main(String[] args) {
Stream<String> stream = Stream.of("10", "20", "30", "40", "50");
// <R> Stream<R> map(Function<? super T, ? extends R> mapper);
// Function 介面 : R apply(T t);
stream.map(Integer::parseInt).forEach(System.out::println);
}
}
組合:concat
- 如果有兩個流,希望合併成為一個流,那麼可以使用Stream介面的靜態方法concat:
- static Stream concat(Stream
import java.util.stream.Stream;
public class Test2 {
public static void main(String[] args) {
Stream<String> stream1 = Stream.of("劉德華", "張學友", "黎明", "郭富城");
Stream<String> stream2 = Stream.of("西施", "楊玉環", "貂蟬", "王昭君");
Stream<String> stream = Stream.concat(stream1, stream2);
stream.forEach(System.out::println);
}
}