如何中止迭代Java Stream forEach
過濾Java中的可選流
Java 8並行流中的自定義線程池
合併Java流
map()和flatMap()之間的區別
Java流的字符串操作
如何使用索引迭代流
Java中將迭代器轉變爲流
如何在Java中獲取流的最後一個元素?
將字符串轉換為字符流
Java中的“流已被操作或關閉”異常
Java 8和無限流
如何向流中添加單個元素
Java 8中的原始類型流
在Java Stream API中有所不同
Java 9 Stream API的改進
Java Spliterator簡介
如何在Java 8流中使用if / else邏輯
Java 8謂詞鏈
具有Lambda表達式的Java流過濾器
用Java流求和
Java 8 Streams peek() API
與Map一起使用流
如何向流中添加單個元素
1.概述
在這篇快速文章中,我們將看一下如何向Java 8 Stream
添加元素,這不像向普通集合中添加元素那樣直觀。
2.前置
我們可以很容易地在前面加上一個給定的元素的Stream
通過調用靜態Stream.
concat ()
方法:
@Test
public void givenStream_whenPrependingObject_thenPrepended() {
Stream<Integer> anStream = Stream.of(1, 2, 3, 4, 5);
Stream<Integer> newStream = Stream.concat(Stream.of(99), anStream);
assertEquals(newStream.findFirst().get(), (Integer) 99);
}
3.追加
同樣,要將元素附加到Stream,
的末尾Stream,
我們只需要反轉參數即可。
請記住, Streams
可以表示無限序列,因此在某些情況下可能永遠無法使用新元素:
@Test
public void givenStream_whenAppendingObject_thenAppended() {
Stream<String> anStream = Stream.of("a", "b", "c", "d", "e");
Stream<String> newStream = Stream.concat(anStream, Stream.of("A"));
List<String> resultList = newStream.collect(Collectors.toList());
assertEquals(resultList.get(resultList.size() - 1), "A");
}
4.在特定索引處
Stream
API並不完全支持此操作,因為從本質**Streams
不是集合,並且不能識別索引的概念**。
因此,為了做到這一點,我們需要將Stream
轉換為列表,然後插入元素,最後從該新列表中獲取Stream
。
請記住,這將為您提供所需的結果,但是您也將失去Stream
的惰性,因為我們需要在插入新元素之前先使用它。
讓我們創建一個實用程序方法來完成繁重的工作:
public <T> Stream<T> insertInStream(Stream<T> stream, T elem, int index) {
List<T> result = stream.collect(Collectors.toList());
result.add(index, elem);
return result.stream();
}
現在,讓我們測試我們的代碼以確保一切都按預期工作:
@Test
public void givenStream_whenInsertingObject_thenInserted() {
Stream<Double> anStream = Stream.of(1.1, 2.2, 3.3);
Stream<Double> newStream = insertInStream(anStream, 9.9, 3);
List<Double> resultList = newStream.collect(Collectors.toList());
assertEquals(resultList.get(3), (Double) 9.9);
}
5.結論
在這篇簡短的文章中,我們已經了解瞭如何向Stream,
添加單個元素Stream,
無論它是在開頭,結尾還是在給定位置。
請記住,儘管在任何Stream,
前面都可以使用元素,但是將元素添加到末尾或在特定索引處僅適用於有限流。
與往常一樣,可以在Github上找到完整的源代碼。