java流式分块订单行成订单

问题描述 投票:0回答:1

我有一个订单流

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 流?

  • 我不想在看到 "订单 "之前收集整个 "行 "流。
  • 我不想看地图
  • 我不在乎 "100 "的订单可能会在10万个元素之后再次出现......因为那是不可能的

--

  • 我读过很多Grouping的文章,还有超级有趣的 "福 "那个那个的文章。
  • 我需要得到它的权利。
  • 在示例中,我显示OrderLine作为字符串 "100-2",以保持它的简单...它是真正的对象与订单号字段,订单行字段等与getters。
java stream grouping
1个回答
1
投票

不如这样吧。 每个地图值是一个列表。键是破折号左边的值。-.

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());

0
投票

您可以从您的输入中创建一个地图,然后只收集地图值

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);


    }
}

© www.soinside.com 2019 - 2024. All rights reserved.