java流列表_使用java流解析列表

我的用例是我有餐馆对象的列表,其中包含属性作为城市,类型,评级,我想按照给定组合(城市,类型)的最高评级打印列表.当我创建这个例子来混淆

java流时,请回复如何使用流来实现:

import java.util.List;

import java.util.ArrayList;

import java.util.stream.Collectors;

import java.util.Map;

import java.util.Optional;

import static java.util.stream.Collectors.maxBy;

import static java.util.stream.Collectors.groupingBy;

import static java.util.Comparator.comparingLong;

class Restaurant {

public String city; // Any city

public String type; // Tier1, Tier2, etc.

public Long rating; // for simplicity sake, assume its a number from 1 to 5

public Restaurant(String city, String type, Long rating) {

this.city = city;

this.type = type;

this.rating = rating;

}

public String getCity() { return city; }

public String getType() { return type; }

public Long getRating() { return rating; }

}

public class HelloWorld

{

public static void main(String[] args)

{

List mylist = new ArrayList();

mylist.add(new Restaurant("City1", "Tier1", 1L));

mylist.add(new Restaurant("City1", "Tier1", 2L));

mylist.add(new Restaurant("City1", "Tier2", 1L));

mylist.add(new Restaurant("City2", "Tier1", 1L));

mylist.add(new Restaurant("City2", "Tier1", 3L));

mylist.add(new Restaurant("City2", "Tier3", 1L));

// expected outcome: (City1, Tier1, 2), (City1, Tier2, 1), (City2, Tier1, 3), (City2, Tier3, 1)

Map>> mymap =

mylist.stream().collect(groupingBy(Restaurant::getCity, groupingBy(Restaurant::getType, maxBy(comparingLong(Restaurant::getRating)))));

/* Upto here everything is fine, but I want to have everything stored back into a list. Tried flatMap(Map::values).collect(Collectors.toList()); but it fails*/

/*My output list should have 4 objects of Restaurant*/

/*(City1, Tier1, 2), (City1, Tier2, 1), (City2, Tier1, 3), (City2, Tier3, 1)*/

}

}

最佳答案 首先,您可以创建复合键以摆脱嵌套映射. Arrays.asList(r.getCity(),r.getType())就是您所需要的.接下来,groupingBy不适合你的情况,因为你应该处理那些讨厌的选项.而是使用带有自定义合并功能的toMap collector:

Map, Restaurant> mymap = mylist.stream().collect(

toMap(r -> Arrays.asList(r.getCity(), r.getType()), r -> r,

BinaryOperator.maxBy(comparingLong(Restaurant::getRating))));

现在mymap.values()是你想要的平面餐馆集合.如果你真的想要List,你可以把它转储成一个:

List list = new ArrayList<>(mymap.values());

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值