在 Java 8 之後,可以用 Stream API 來處理資料集合,最大的好處就是巢狀結構消失了,比較容易閱讀、看出商業邏輯,以下紀錄比較常用的操作:
建立 Stream
- of
- empty
- concat
- generate:產生無限串流 的方法之一。
- iterate:產生無限串流的方法之二。
// 示範 of
Stream<String> fooBarBazStream = Stream.of("foo", "bar", "baz");
// 示範 empty
Stream<String> emptyStream = Stream.empty();
// 示範 concat
Stream<String> stream1 = Stream.of("foo", "bar");
Stream<String> stream2 = Stream.of("baz");
Stream<String> stream3 = Stream.concat(stream1, stream2);
// 示範 generate
Stream<String> helloStream = Stream.generate(() -> "hello"); // 總是回傳 "hello"
String<Double> randomStream = Stream.generate(Math::random); // 每次回傳一個亂數
// 示範 iterate
Integer seed = 1;
Stream<Integer> oneTwoFourEghitStream = Stream.iterate(seed, n -> n*2); // 1, 2, 4, 8...
中間操作
- peek:常用來 debug,印出經過元素。
- limit
- skip
- distinct:去除重複
- sorted
- filter
- map:將經過的元素類型轉換成別種元素類型,比如:員工物件轉成姓名字串。
- mapToInt
- mapToLong
- mapToDouble
- flatMap:將經過元素轉換成該元素內資料集合的元素,比如:一個員工有兩個電話(手機和住家電話),將傳入的三位員工轉成六個電話字串。
- flatMapToInt
- flatMapToLong
- flatMapToDouble
// 示範 distinct
Stream.of("a", "b", "a", "b")
.distinct()
.forEach(e -> System.out.print(e)); // 印出 "ab"
// 示範 map
employees.stream()
.map(e -> e.getName())
.forEach(name -> System.out.println(name)); // 印出所有員工的姓名
// 示範 flatMap
employees.stream()
.flatMap(e -> e.getPhoneList().stream()) // 傳入一位員工,發送出多筆電話
.forEach(phone -> System.out.println(phone)); // 印出所有員工的電話
終止操作
終止操作完了以後,Stream 就不能再使用了。
- max
- min
- findFirst
- findAny
- anyMatch:有符合條件的元素回傳 true。
- allMatch
- noneMatch
- orElse
- count
- forEach:很像 peek,但 peek 是中間操作,需要一個終止操作才能執行。
- collect:返回的是集合。
- toArray:返回的會是陣列。
- reduce:可以去看一下 Google 提出的 MapReduce 概念
// 示範 collect
List<String> nameList =
employees.stream()
.map(e -> e.getName())
.collect(Collectors.toList());
0 則回應: