我想加倍Stream(沒有DoubleStream)。這意味着我從一個流開始,並希望獲得一個新流,其中舊流的每個元素都會流兩次。所以1,2,3,4,4,5給我們1,1,2,2,3,3,4,4,4,4,5,5。是否有這樣的流操作?雙流
雙流
回答
創建一個包含當前元素兩次的內部流和flatMap這個流。
stream.flatMap(e -> Stream.of(e,e))
如果您想通過n
乘元素的數量,您可以創建一個實用的方法像這樣的:
public static <T> Stream<T> multiplyElements(Stream<T> in, int n) {
return in.flatMap(e -> IntStream.range(0, n).mapToObj(i -> e));
// we can also use IntStream.rangeClosed(1, n)
// but I am used to iterating from 0 to n (excluding n)
}
(但要儘量用一個更好的名字了這種方法,因爲目前的一個可以是不明確的)
用例:
multiplyElements(Stream.of(1,2), 3).forEach(System.out::println);
輸出:
1
1
1
2
2
2
'repeatEach()'可能會是一個好名字:) –
從數學的角度來看,一個好名字將會是'對角化(流
可以爲每個原始元素創建2個分量流和flatMap它:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 4, 5);
List<Integer> doubled = list.stream().flatMap(i -> Stream.of(i, i)).collect(toList());
恕我直言,你應該提到靜態導入,比如'Collectors.toList' – fabian
這裏是什麼biziclop在評論中描述了一個簡單的例子。
static <E> Collection<E> multiply(Collection<E> source, int count) {
return new AbstractCollection<E>() {
@Override
public int size() {
return count * source.size();
}
@Override
public Iterator<E> iterator() {
return new Iterator<E>() {
final Iterator<E> it = source.iterator();
E next;
int i = 0;
@Override
public boolean hasNext() {
return i < size();
}
@Override
public E next() {
if (hasNext()) {
if ((i % count) == 0) {
next = it.next();
}
++i;
return next;
} else {
throw new NoSuchElementException();
}
}
};
}
};
}
(例如工作在Ideone。)
CW'd因爲它不是我的想法和建議flatMap
更直接地回答這個問題。
- 1. 雙腿OAuth工作流
- 2. 節點JS TLS雙工流
- 3. 如何寫入雙工流?
- 4. 如何在NodeJS中對雙向雙工流進行編碼
- 5. 工作流服務雙工綁定
- 6. 停止流利從產生雙外鍵
- 7. WCF雙工內的TPL數據流塊
- 8. Java EE中的雙工流式傳輸
- 9. 帶雙引號環繞電流選擇
- 10. 在NodeJS中包裝雙向流
- 11. 流星,發佈雙連接反應
- 12. JSON.parse扼流圈雙引號串
- 13. NodeJS:雙工流和變換流有什麼區別?
- 14. 將兩個單向流組合成雙向流
- 15. 雙[] - >雙擊[,]
- 16. 雙? = double? +雙?
- 17. 串口,相當於「全雙工」流量控制?
- 18. 混合雙/單方向的節點 - (流利)NHibernate的
- 19. 流利的NHibernate:如何創建一對一的雙向映射?
- 20. 流利Nhibernate HasManyToMany雙方與諾普地圖
- 21. 如何在視頻流的picturebox上獲得雙擊事件
- 22. 張量流中的字符級雙向語言模型
- 23. 流星clik事件,雙擊;只使用JS
- 24. 流利NHibernate雙向多對一IConvertible異常
- 25. 全雙工共享文件夾中的流浪
- 26. 在線多媒體流和雙向通信/會議選項
- 27. 孩子類如何以雙設計模式進行交流?
- 28. 使用反應和流星進行雙向數據綁定
- 29. 解析一個字符串流成字符串和雙打
- 30. WCF,NetTcpBinding,流傳輸模式可以是雙工的?
只需注意:另一種方法是創建一個返回每個元素兩次的原始集合(或其他流源)的視圖。我不是說這就是你應該做的,只是它是一種選擇,在某些情況下,視圖方法效果更好。 – biziclop
@biziclop:這實際上可能比'flatMap'解決方案更高效,因爲來自此視圖的流將能夠報告其確切的大小。 –
@TagirValeev它不需要創建'n'中間流。 – biziclop