Возможно ли поэтапное сопоставление потока без создания промежуточных коллекций?
Я работаю с Selenium и картографическими потоками WebElement
s. Важно, чтобы они выполнялись партиями, чтобы избежать выброса StaleReferenceException
, поскольку страница динамически обновляется, а выполнение некоторых операций map
занимает относительно много времени.
Задача (упрощенная):
public class StreamTest {
public static void main(String[] args) {
String[] input = new String[] {"1", "2", "3", "4", "5"};
List<String> list = map(input).collect(Collectors.toList());
}
private static Stream<String> map(String[] input) {
return Arrays.stream(input).parallel()
.map(s -> {
String ret = s + "0";
System.out.println(String.format("%10s%10s", s, ret));
return ret;
})
.map(s -> {
String ret = s + "0";
System.out.println(String.format("%10s%10s", s, ret));
return ret;
})
.map(s -> {
String ret = s + "0";
System.out.println(String.format("%10s%10s", s, ret));
return ret;
});
}
}
Пример вывода:
3 30
4 40
30 300
1 10
5 50
10 100
2 20
50 500
300 3000
40 400
500 5000
20 200
100 1000
400 4000
200 2000
Желаемый вывод:
1 10
2 20
3 30
4 40
5 50
10 100
20 200
30 300
40 400
50 500
100 1000
200 2000
300 3000
400 4000
500 5000
Текущее решение:
private static Stream<String> map(String[] input) {
return Arrays.stream(input)
.map(s -> s + "0")
.collect(Collectors.toList()).stream()
.map(s -> s + "0")
.collect(Collectors.toList()).stream()
.map(s -> s + "0");
}
Есть ли способ достичь этого без создания фиктивной коллекции между каждым вызовом map
?
Примечание: мне нужно использовать поток с n вызовами map
вместо последовательности n for-loop.