Table of Contents
ToggleInitialize Stream in Java
初始化 Stream 物件,其中的元素是特定類型的物件,形成一個隊列,流的來源,可以是集合、陣列、 I/O channel 或 generator 產生器等,可以聚合操作類似 SQL 語句一樣的操作,使用 collection 、 stream 、 builder 、 generate 等方法建立 Stream 物件, Initialize Stream Java 本篇增加了範例,並透過單元測試來驗證產出結果。
檔案目錄
./
+- src
+- test
| +- org
| +- ruoxue
| +- java_147
| +- stream
| +- InitializeStreamTest.java
單元測試
Java Initialize Stream 提供初始化 Stream 。
collection
Java Initialize Stream 建立一個 Stream ,初始化三個元素。
@Test
public void collection() {
int expectedCount = 3;
List<String> list = Arrays.asList("Coconut", "Lichee", "Plum");
Stream<String> stream = list.stream();
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
List<Integer> intList = Arrays.asList(1, 2, 3);
Stream<Integer> intStream = intList.stream();
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
java.util.stream.ReferencePipeline$Head@694f9431
Coconut
Lichee
Plum
java.util.stream.ReferencePipeline$Head@5c8da962
1
2
3
stream
Java Initialize Stream 建立一個 Stream ,初始化三個元素。
@Test
public void stream() {
int expectedCount = 3;
Stream<String> stream = Stream.of("Coconut", "Lichee", "Plum");
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
String[] array = new String[] { "Coconut", "Lichee", "Plum" };
stream = Stream.of(array);
System.out.println(stream);
count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
Stream<Integer> intStream = Stream.of(1, 2, 3);
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
int[] intArray = new int[] { 1, 2, 3 };
Stream<int[]> streamIntArray = Stream.of(intArray);
IntStream intArrayStream = streamIntArray.flatMapToInt(e -> Arrays.stream(e));
System.out.println(intArrayStream);
count = intArrayStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
java.util.stream.ReferencePipeline$Head@694f9431
Coconut
Lichee
Plum
java.util.stream.ReferencePipeline$Head@5c8da962
Coconut
Lichee
Plum
java.util.stream.ReferencePipeline$Head@2c13da15
1
2
3
java.util.stream.ReferencePipeline$8@16f65612
1
2
3
array
Java Initialize Stream 建立一個 Stream ,初始化三個元素。
@Test
public void array() {
int expectedCount = 3;
String[] array = new String[] { "Coconut", "Lichee", "Plum" };
Stream<String> stream = Arrays.stream(array);
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
stream = Arrays.stream(array, 0, 2);
System.out.println(stream);
count = stream.peek(System.out::println).count();
assertEquals(2, count);
int[] intArray = new int[] { 1, 2, 3 };
Stream<Integer> intStream = Arrays.stream(intArray).boxed();
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
intStream = Arrays.stream(intArray, 0, 2).boxed();
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(2, count);
}
java.util.stream.ReferencePipeline$Head@694f9431
Coconut
Lichee
Plum
java.util.stream.ReferencePipeline$Head@5c8da962
Coconut
Lichee
java.util.stream.IntPipeline$4@9e89d68
1
2
3
java.util.stream.IntPipeline$4@16f65612
1
2
builder
Stream Initialization Java 建立一個 Stream ,初始化三個元素。
@Test
public void builder() {
int expectedCount = 3;
Stream.Builder<String> builder = Stream.builder();
Stream<String> stream = builder.add("Coconut").add("Lichee").add("Plum").build();
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
Stream.Builder<Integer> intBuilder = Stream.builder();
Stream<Integer> intStream = intBuilder.add(1).add(2).add(3).build();
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
java.util.stream.ReferencePipeline$Head@694f9431
Coconut
Lichee
Plum
java.util.stream.ReferencePipeline$Head@5c8da962
1
2
3
generate
Stream Initialization Java 建立一個 Stream ,初始化三個元素。
@Test
public void generate() {
int expectedCount = 3;
Stream<String> stream = Stream.generate(() -> "Lichee").limit(3);
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
stream = Stream.generate(() -> UUID.randomUUID().toString()).limit(3);
System.out.println(stream);
count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
Stream<Integer> intStream = Stream.generate(() -> (int) (Math.random() * 100)).limit(3);
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
java.util.stream.SliceOps$1@5fdef03a
Lichee
Lichee
Lichee
java.util.stream.SliceOps$1@77556fd
703d06a9-f6ea-4245-858e-3a9fd29d18f4
c9ef3638-257a-4546-9896-3b0456e180a2
1b37f994-42a4-4088-a4d7-b95a2c43905a
java.util.stream.SliceOps$1@e6ea0c6
84
27
19
pattern
Stream Initialization Java 建立一個 ImmutableList 不可變的 List ,初始化三個元素。
@Test
public void pattern() {
int expectedCount = 1;
Pattern pattern = Pattern.compile("^L");
List<String> list = Arrays.asList("Coconut", "Lichee", "Plum");
Stream<String> stream = list.stream().filter(pattern.asPredicate());
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
java.util.stream.ReferencePipeline$2@3b22cdd0
Lichee
InitializeStreamTest.java
Stream Initialization Java 新增單元測試,驗證 Java Stream Initialize 是否符合預期。
package org.ruoxue.java_147.stream;
import static org.junit.Assert.*;
import java.util.Arrays;
import java.util.List;
import java.util.UUID;
import java.util.regex.Pattern;
import java.util.stream.IntStream;
import java.util.stream.Stream;
import org.junit.Test;
public class InitializeStreamTest {
@Test
public void collection() {
int expectedCount = 3;
List<String> list = Arrays.asList("Coconut", "Lichee", "Plum");
Stream<String> stream = list.stream();
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
List<Integer> intList = Arrays.asList(1, 2, 3);
Stream<Integer> intStream = intList.stream();
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
@Test
public void stream() {
int expectedCount = 3;
Stream<String> stream = Stream.of("Coconut", "Lichee", "Plum");
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
String[] array = new String[] { "Coconut", "Lichee", "Plum" };
stream = Stream.of(array);
System.out.println(stream);
count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
Stream<Integer> intStream = Stream.of(1, 2, 3);
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
int[] intArray = new int[] { 1, 2, 3 };
Stream<int[]> streamIntArray = Stream.of(intArray);
IntStream intArrayStream = streamIntArray.flatMapToInt(e -> Arrays.stream(e));
System.out.println(intArrayStream);
count = intArrayStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
@Test
public void array() {
int expectedCount = 3;
String[] array = new String[] { "Coconut", "Lichee", "Plum" };
Stream<String> stream = Arrays.stream(array);
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
stream = Arrays.stream(array, 0, 2);
System.out.println(stream);
count = stream.peek(System.out::println).count();
assertEquals(2, count);
int[] intArray = new int[] { 1, 2, 3 };
Stream<Integer> intStream = Arrays.stream(intArray).boxed();
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
intStream = Arrays.stream(intArray, 0, 2).boxed();
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(2, count);
}
@Test
public void builder() {
int expectedCount = 3;
Stream.Builder<String> builder = Stream.builder();
Stream<String> stream = builder.add("Coconut").add("Lichee").add("Plum").build();
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
Stream.Builder<Integer> intBuilder = Stream.builder();
Stream<Integer> intStream = intBuilder.add(1).add(2).add(3).build();
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
@Test
public void generate() {
int expectedCount = 3;
Stream<String> stream = Stream.generate(() -> "Lichee").limit(3);
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
stream = Stream.generate(() -> UUID.randomUUID().toString()).limit(3);
System.out.println(stream);
count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
Stream<Integer> intStream = Stream.generate(() -> (int) (Math.random() * 100)).limit(3);
System.out.println(intStream);
count = intStream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
@Test
public void pattern() {
int expectedCount = 1;
Pattern pattern = Pattern.compile("^L");
List<String> list = Arrays.asList("Coconut", "Lichee", "Plum");
Stream<String> stream = list.stream().filter(pattern.asPredicate());
System.out.println(stream);
long count = stream.peek(System.out::println).count();
assertEquals(expectedCount, count);
}
}
心得分享
Java Stream Initialize 初始化 Stream 物件,大多數操作,會傳回 Stream 本身,以便可以對結果進行流水線的處理,如同流式風格 Fluent Style ,可以對操作進行優化,比如延遲執行 Laziness 和短路 Short-circuiting 操作, Stream Initialization Java 提供了幾種 Stream 初始化的操作範例,使用單元測試驗證產出結果。