如何向流中添加單個元素

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上找到完整的源代碼。