我有一个List counties
,其中只包含唯一的县名,还有一个List txcArray
,其中包含该城市的城市名称,县名和人口。
我需要使用带有lambda表达式和txcArray
s的Java 8从Stream
获取每个县的最大城市名称。
这是我到目前为止的代码:
List<String> largest_city_name =
counties.stream()
.map(a -> txcArray.stream()
.filter(b -> b.getCounty().equals(a))
.mapToInt(c -> c.getPopulation())
.max())
.collect( Collectors.toList());
我正在尝试在.max()
之后添加另一个.map语句来获取具有最大填充的City
的名称但是我的新lambda表达式不存在于txcArray的流中它只识别它作为int
类型和texasCitiesClass类型。这是我想要做的。
List<String> largest_city_name =
counties.stream()
.map(a -> txcArray.stream()
.filter( b -> b.getCounty().equals(a))
.mapToInt(c->c.getPopulation())
.max()
.map(d->d.getName()))
.collect( Collectors.toList());
有人能告诉我我做错了吗?
答案 0 :(得分:5)
您完全不需要counties
列表。只需流txcArray
并按县分组:
Collection<String> largestCityNames = txcArray.stream()
.collect(Collectors.groupingBy(
City::getCounty,
Collectors.collectingAndThen(
Collectors.maxBy(City::getPopulation),
o -> o.get().getName())))
.values();
答案 1 :(得分:3)
好吧,一旦将map
个Stream
个城市改为IntStream
,就无法恢复与int
值对应的城市名称。
使用Stream
的{{1}}代替转换为max
:
IntStream
这种方式List<String> largest_city_name =
counties.stream()
.map(a -> txcArray.stream()
.filter(b -> b.getCounty().equals(a))
.max(Comparator.comparingInt(City::getPopulation))
.get())
.map(City::getName)
.collect(Collectors.toList());
操作将每个县映射到人口最多的map
。请注意,City
会返回max
,因此Optional<City>
为空(即某些县没有城市),Optional
会抛出异常。
要避免此问题,您可以写:
get()
这会将没有城市的县映射为空List<String> largest_city_name =
counties.stream()
.map(a -> txcArray.stream()
.filter(b -> b.getCounty().equals(a))
.max(Comparator.comparingInt(City::getPopulation))
.map(City::getName)
.orElse(""))
.collect(Collectors.toList());
。
此代码假定String
为txcArray
,其中List<City>
为:
class City { public String getName(){return nam;} public int getPopulation(){return pop;} public String getCounty(){return cnt;} 字符串nam; int pop; String cnt; public City(String nam,int pop,String cnt){ this.nam = nam; this.pop = pop; this.cnt = cnt; } }
和City
是counties
。如果我的假设不准确,你将不得不做出一些调整。
现在,使用以下List<String>
s测试代码:
List
生成此输出List<String> counties=new ArrayList<> ();
counties.add ("First");
counties.add ("Second");
counties.add ("Third");
counties.add ("Fourth");
List<City> txcArray = new ArrayList<> ();
txcArray.add (new City("One",15000,"First"));
txcArray.add (new City("Two",12000,"First"));
txcArray.add (new City("Three",150000,"Second"));
txcArray.add (new City("Four",14000,"Second"));
txcArray.add (new City("Five",615000,"Third"));
txcArray.add (new City("Six",25000,"Third"));
:
List