我有一个订单流
Stream<String> lines=Stream.of("100-1","100-2","100-3",
"120-1",
"333-1","333-2"); // .. millions of lines
现在,我想把这些东西分块映射成一个流,比如说
Stream<List<String>> orders=Stream.of(
Arrays.asList("100-1","100-2","100-3"),
Arrays.asList("120-1"),
Arrays.asList("333-1","333-2")); // .. thousands of orders
现在,我可以将流中的每个元素作为一个订单进行处理,我想将 "订单 "流中的每个元素作为订单的单位进行读取。
我怎样才能从 lines --> orders 流?
--
不如这样吧。 每个地图值是一个列表。键是破折号左边的值。-
.
Map<String, List<String>> orders = Stream
.of("100-1", "100-2", "100-3", "120-1", "333-1",
"333-2")
.collect(Collectors.groupingBy(order -> order
.substring(0, order.indexOf("-"))));
orders.entrySet().forEach(System.out::println);
印刷品
100=[100-1, 100-2, 100-3]
333=[333-1, 333-2]
120=[120-1]
所以你可以这样做。
List<String> order100 = orders.get("100");
System.out.println(order100);
印刷品
[100-1, 100-2, 100-3]
如果你不想处理地图,而只是想要订单的列表,你可以从地图中得到这个。
List<List<String>> lists =
orders.values().stream().collect(Collectors.toList());
您可以从您的输入中创建一个地图,然后只收集地图值
import scala.Tuple2;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class WordSpliter {
public static void main(String[] args) {
Stream<String> lines= Stream.of("100-1","100-2","100-3",
"120-1",
"333-1","333-2");
Stream<List<String>> map = lines.map((String str) ->
new Tuple2<>(str.substring(0, str.indexOf("-")), str)
).collect(Collectors.groupingBy(Tuple2::_1, Collectors.mapping(Tuple2::_2, Collectors.toList())))
.values().stream();
map.forEach(System.out::println);
}
}