Tôi muốn tăng gấp đôi số Stream (không DoubleStream). Có nghĩa là tôi bắt đầu bằng luồng và muốn nhận luồng mới trong đó mỗi phần tử của luồng cũ được phát trực tiếp hai lần. Vì vậy, 1,2,3,4,4,5 cho chúng ta 1,1,2,2,3,3,4,4,4,4,5,5. Có hoạt động luồng như vậy không?Double a stream
Trả lời
Tạo luồng bên trong chứa phần tử hiện tại hai lần và flatMap luồng này.
stream.flatMap(e -> Stream.of(e,e))
Nếu bạn muốn để nhân số phần tử bằng n
bạn có thể tạo ra một phương pháp hữu ích như thế này:
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)
}
(nhưng cố gắng sử dụng một tên tốt hơn cho phương pháp này, vì hiện tại người ta có thể được mơ hồ)
Cách sử dụng Ví dụ:
multiplyElements(Stream.of(1,2), 3).forEach(System.out::println);
Output:
1
1
1
2
2
2
'repeatEach()' có thể là một tên tốt :) –
Từ quan điểm toán học, một tên tốt sẽ là 'diagonalize (Luồng
Bạn có thể tạo một dòng của 2 yếu tố cho mỗi phần tử gốc và flatMap nó:
List<Integer> list = Arrays.asList(1, 2, 3, 4, 4, 5);
List<Integer> doubled = list.stream().flatMap(i -> Stream.of(i, i)).collect(toList());
IMHO bạn nên đề cập đến nhập tĩnh, như 'Collectors.toList' – fabian
Dưới đây là một ví dụ đơn giản về những gì biziclop đã được mô tả trong các ý kiến.
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();
}
}
};
}
};
}
(ví dụ làm việc trên Ideone.)
CW'd vì nó không phải là ý tưởng của tôi và flatMap
gợi ý trực tiếp hơn trả lời câu hỏi.
- 1. Sự khác nhau giữa double a = a + int b và int a + = double b là gì?
- 2. Trong C++, sự khác nhau giữa static_cast <double> (a) và double (a) là gì?
- 3. C#: double [] [] và double [,]
- 4. Junit chênh lệch giữa assertEquals (Double, Double) và assertEquals (double, double, đồng bằng)
- 5. nodejs stream vs callbacks
- 6. Nếu double a = 0.0, tôi có thể so sánh trực tiếp * b == 0 không?
- 7. Mục đích của việc này là gì: "double x = x = (a - b)/(c - 1);"
- 8. lý do tại sao math.Ceiling (double a) không trả về int trực tiếp?
- 9. Double-Loop trong msbuild?
- 10. Regex.Matches C# double quotes
- 11. Float vs double Math Java
- 12. Memory Stream là DB
- 13. Haskell's Stream Fusion
- 14. Đóng Java 8 Stream
- 15. System.Drawing.Image to stream C#
- 16. Stream StringBuilder để nộp
- 17. Scala Stream vs Java Stream Sự khác biệt về sự khác biệt
- 18. Chuyển đổi int64_t thành double
- 19. Làm cách nào để chuyển đổi Double [] thành double []?
- 20. lỗi: chức năng "atomicAdd (double *, double)" đã được xác định
- 21. Làm (a, a) a Functor
- 22. yếu tố đếm của một Stream
- 23. C# volatile double
- 24. Unsigned double in C++?
- 25. Double LEFT JOIN
- 26. Binding Double to TextBox
- 27. MySQL double sort
- 28. Android Double Tap
- 29. Double in HashMap
- 30. TryCast to Double?
Chỉ cần lưu ý: cách tiếp cận khác là chỉ tạo chế độ xem bộ sưu tập gốc (hoặc nguồn khác của luồng) trả về từng phần tử hai lần. Tôi không nói đó là những gì bạn nên làm, chỉ là đó là một lựa chọn và trong một số trường hợp, cách tiếp cận xem hoạt động tốt hơn. – biziclop
@biziclop: điều này thực sự có thể hoạt động hiệu quả hơn giải pháp 'flatMap' khi luồng từ chế độ xem như vậy sẽ có thể báo cáo kích thước chính xác của nó. –
@TagirValeev Và nó không yêu cầu tạo luồng trung gian 'n'. – biziclop