Java 使用流从地图内部的地图获取数据
我从嵌套在另一个地图中的地图接收数据时遇到问题Java 使用流从地图内部的地图获取数据,java,collections,hashmap,java-stream,Java,Collections,Hashmap,Java Stream,我从嵌套在另一个地图中的地图接收数据时遇到问题 private Map<Customer, Map<Item,Integer>> orders; 使用我想得到的数据流,例如,为购买物品支付最多的客户,但我在从地图上获取这些数据时遇到了问题,使用列表并不是那么困难,但现在我无法找到它 好吧,我确实想出了这样的办法,它似乎是可行的,但我相信它可以简化 Customer key = customersMap.entrySet() .stream
private Map<Customer, Map<Item,Integer>> orders;
使用我想得到的数据流,例如,为购买物品支付最多的客户,但我在从地图上获取这些数据时遇到了问题,使用列表并不是那么困难,但现在我无法找到它
好吧,我确实想出了这样的办法,它似乎是可行的,但我相信它可以简化
Customer key = customersMap.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue()
.entrySet()
.stream()
.map(o -> o.getKey().getPrice().multiply(BigDecimal.valueOf(o.getValue())))
.collect(Collectors.toList())))
.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, t -> t.getValue().stream().reduce(BigDecimal.ZERO, BigDecimal::add)))
.entrySet()
.stream()
.max(Map.Entry.comparingByValue())
.orElseThrow()
.getKey();
你的回答Naman很有帮助,所以也许你可以给我一些建议。
这就是我从JSON接收它的方式
JsonConverterCustomer jsonConverterCustomer = new JsonConverterCustomer(FILENAME3);
List<Order> orders = jsonConverterCustomer.fromJson().orElseThrow();
Map<Customer, Map<Item, Integer>> customersMap = new HashMap<>();
for (Order order : orders) {
if (!customersMap.containsKey(order.getCustomer())) {
addNewCustomer(customersMap, order);
} else {
for (Product product : order.getItems()) {
if (!customersMap.get(order.getCustomer()).containsKey(items)) {
addNewCustomerItem(item, customersMap.get(order.getCustomer()));
} else {
updateCustomerItem(customersMap, order, item);
}
}
}
}
private static void updateCustomerProduct(Map<Customer, Map<Item, Integer>> customersMap, Order order, Item item) {
customersMap.get(order.getCustomer())
.replace(item,
customersMap.get(order.getCustomer()).get(item),
customersMap.get(order.getCustomer()).get(item) + 1);
}
private static void addNewCustomerItem(Item item, Map<Item, Integer> itemIntegerMap) {
itemIntegerMap.put(item, 1);
}
private static void addNewCustomer(Map<Customer, Map<Item, Integer>> customersMap, Order order) {
Map<Item, Integer> temp = new HashMap<>();
addNewCustomerItem(order.getItems().get(0), temp);
customersMap.put(order.getCustomer(), temp);
}
jsonconvertercertstomer jsonconvertercertstomer=newjsonconvertercertstomer(FILENAME3);
List orders=jsonconverterrcustomer.fromJson().orelsetrow();
Map CustomerMap=新建HashMap();
对于(订单:订单){
如果(!customersMap.containsKey(order.getCustomer())){
addNewCustomer(CustomerMap,订单);
}否则{
对于(产品:order.getItems()){
如果(!customersMap.get(order.getCustomer()).containsKey(items)){
addNewCustomerItem(item,customerMap.get(order.getCustomer());
}否则{
updateCustomerItem(CustomerMap、order、item);
}
}
}
}
私有静态void updateCustomerProduct(映射CustomerMap、订单、项目){
customerMap.get(order.getCustomer())
.更换(第,
customerMap.get(order.getCustomer()).get(item),
get(order.getCustomer()).get(item)+1);
}
私有静态void addNewCustomerItem(项项、映射项整数映射){
itemIntegerMap.put(第1项);
}
私有静态void addNewCustomer(映射CustomerMap,订单){
Map temp=newhashmap();
addNewCustomerItem(order.getItems().get(0),temp);
customerMap.put(order.getCustomer(),temp);
}
Order类是一个帮助我从JSON接收数据的类
这是一个简单的类,Customer作为字段,List作为字段。
正如你们所看到的,我正在接收订单列表,并从中创建这个地图。
我能让它更实用吗?使用流?我试着去做,但不知道怎么做/ 正如Jason所指出的,有两种可能的方法使其更易于维护/可读,同时简化执行的逻辑
- 首先,您可以去掉管道中的一个阶段,并将
和map
合并到单个管道中reduce
- 另一种方法是提取每个客户支付的总金额
private BigDecimal totalPurchaseByCustomer(Map<Item, Integer> customerOrders) {
return customerOrders.entrySet()
.stream()
.map(o -> o.getKey().getPrice().multiply(BigDecimal.valueOf(o.getValue())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
正如Jason所指出的,有两种可能的方法可以使它更易于维护/可读,同时简化执行的逻辑
- 首先,您可以去掉管道中的一个阶段,并将
和map
合并到单个管道中reduce
- 另一种方法是提取每个客户支付的总金额
private BigDecimal totalPurchaseByCustomer(Map<Item, Integer> customerOrders) {
return customerOrders.entrySet()
.stream()
.map(o -> o.getKey().getPrice().multiply(BigDecimal.valueOf(o.getValue())))
.reduce(BigDecimal.ZERO, BigDecimal::add);
}
发布你已经尝试过的代码。这不是那么简单,因为我尝试过几次删除它尝试不同的方法,并且在过程中总会有一些我无法克服的地方。如果你不付出一些努力,我怀疑是否有人会帮助你。这样做的方法是,首先你自己解决问题,如果你没有成功,你发布你的代码和你被卡住的地方的描述。我理解这位朋友,但我浪费了很多时间,因为它没有弄明白,所以我在这里尝试,因为我没有想法,我只是被卡住了。我几乎确定我应该使用entrySet和form,尝试收集一些数据,但每次我碰壁时/我甚至不需要一个纯粹的解决方案,只要举例说明如何处理它,从嵌套的地图中获取一些数据。然后我会试着自己解决一些问题,我只是不想再花一个小时在上面,没有任何结果。发布你已经尝试过的代码。这并不简单,因为我尝试过几次删除它,尝试不同的方法,但在过程中的某个地方总是有一些我无法克服的问题。我怀疑是否有人会帮助你没有你的努力。这样做的方法是,首先你自己解决问题,如果你没有成功,你发布你的代码和你被卡住的地方的描述。我理解这位朋友,但我浪费了很多时间,因为它没有弄明白,所以我在这里尝试,因为我没有想法,我只是被卡住了。我几乎确定我应该使用entrySet和form,尝试收集一些数据,但每次我碰壁时/我甚至不需要一个纯粹的解决方案,只要举例说明如何处理它,从嵌套的地图中获取一些数据。然后我会试着自己解决一些问题,我只是不想再花一个小时在上面,没有任何结果。@Tausa这可能值得一个新问题,一定要确保在发布之前自己尝试一下。:)仅从概述中,您可以使用收集器toMap创建
Map
,但它可能需要一个flatMap
ping作为中间操作。@Tausa它可能值得一个新问题,并确保在发布之前您自己尝试一些东西。:)仅从概述中,您可以使用收集器toMap创建Map
,但它可能需要一个flatMap
ping作为中间操作。
private Customer maxPayingCustomer(Map<Customer, Map<Item, Integer>> customersMap) {
Map<Customer, BigDecimal> customerPayments = customersMap.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> totalPurchaseByCustomer(e.getValue())));
return customerPayments.entrySet()
.stream()
.max(Map.Entry.comparingByValue())
.map(Map.Entry::getKey)
.orElseThrow();
}