我正在尝试使用Java流对对象的两个属性进行分组。正如一些答案所证明的那样,这很容易:
products.stream().collect(
Collectors.groupingBy(Product::getUpc,
Collectors.groupingBy(Product::getChannelIdentifier)));
例如,上面的代码片段将以以下形式生成地图
Map<String, Map<String, List<Product>>>
其中,一个映射具有UPC代码的键,其值是具有通道标识符键的映射,这些键引用了产品列表。
这很酷,但是如果我不需要嵌套的值作为映射呢?也就是说,我想按ChannelIdentifier组织嵌套集合,但我只关心。映射的值(),而不是映射本身。有没有办法得到符合以下条件的结果?
Map<String, List<List<Product>>
列表或集合。。。没关系。谢谢
分组操作不可避免地需要维护一个Map
,因为它必须跟踪分组的键值。但是您可以直接使用value()
视图:
Map<String, Collection<List<Product>>> m=products.stream().collect(
Collectors.groupingBy(Product::getUpc, Collectors.collectingAndThen(
Collectors.groupingBy(Product::getChannelIdentifier), Map::values)));
如果生成的映射将具有更长的生存期,并且您希望减少所需的存储空间,或者如果您需要列表
,则可以在该步骤中将视图复制到列表中:
Map<String, List<List<Product>>> map=products.stream().collect(
Collectors.groupingBy(Product::getUpc, Collectors.collectingAndThen(
Collectors.groupingBy(Product::getChannelIdentifier),
m -> new ArrayList<>(m.values()) )));
我有一个映射集合,其中包含productId、数量和订单数量的列表,格式为productId=[quantity,no of orders]。地图收藏就像 对于每个productId,都有数量和数量的订单。代码是用java返回的。我的要求是,我想将订单的ProductID、数量和编号分成3个不同的列表,如 订单的数量和编号应该与它们相关的产品Id相匹配。我如何在java中实现这一点?
我试图对对象中的每个条目执行映射操作。 我需要从键中去掉前缀,并将值从一种类型转换为另一种类型。我的代码从 映射实例并使用,这看起来很难看。 还有更好的选择吗?使用for循环似乎更好: 我应该避免使用流API吗?还是我错过了更好的方式?
操作步骤: ①在"图层管理"模块,选择图层,点击"更多"按钮。 ②点击"复制数据密钥"按钮。 ③弹出"复制数据密钥窗口",点击"复制"按钮。 ④进入想要合并的地图,点击地图右上工具条上的"数据密钥"按钮。 ⑤弹出"导入数据密钥窗口",粘贴刚才复制的密钥,点击"导入"按钮,数据在地图导入成功。 提示: ●复制图层数据参考复制拷贝图层 操作动图: [查看原图]
KEY1---->VAL1 KEY2---->VAL3 KEY3---->VAL3 KEY5---->VAL5 KEY6---->VAL3 KEY7---->VAL6 KEY8---->VAL3 KEY9---->VAL3
我想使用Java8 streams API对数据进行分组。所有具有父_id的行都应分组在一起。下面是示例文本文件。结果应该是一个映射,其中id是一个整数,值是各自分组的行。例如,在下面的例子中,结果将是一个包含3个条目的映射。键1对应2个值,键2对应无值,键3对应1个值。 代码片段是: 输出可以是:。 简单的规则是:如果父母ID不是空的,这些记录应该被分组到一个列表中。这个列表将被视为map中的值
我试图使用