Java Stream API Cheat Sheet

在 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 則回應: