如何在带有lambda表达式

时间:2017-10-11 01:53:56

标签: java lambda collections java-8 java-stream

我有一个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());

有人能告诉我我做错了吗?

2 个答案:

答案 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)

好吧,一旦将mapStream个城市改为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());

此代码假定StringtxcArray,其中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;        }    }

Citycounties。如果我的假设不准确,你将不得不做出一些调整。

现在,使用以下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