Java - Lambda筛选条件,忽略添加到地图 [英] Java - Lambda filter criteria, to ignore adding to map

查看:455
本文介绍了Java - Lambda筛选条件,忽略添加到地图的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有格式的地图(参考使用Lambda查找平均值(双字符串存储)

 地图< String,Double> ():
.filter(objectDTO - >!objectDTO.getNewIndex()。isEmpty())
。 collect(Collectors.groupingBy(ObjectDTO :: getCountryName,
Collectors.mapping(ObjectDTO :: getNewIndex,
Collectors.averagingDouble(Double :: parseDouble))));

我想忽略忽略整个国家/地区的映射,即使其中一个是newIndex值country is empty?

解决方案

由于 Collectors.groupingBy 不允许跳过组,您必须提前分析过滤条件,以便您可以在执行 groupBy 之前进行过滤,或者之后过滤映射(我忽略第三个选项,实现您自己的 groupingBy 收藏家。


  1. 提前分析:

      Map< String,Boolean> hasEmpty = mapOfIndicators.values()。stream()
    .flatMap(Collection :: stream)
    .collect(Collectors.groupingBy(ObjectDTO :: getCountryName,
    )Collectors.mapping(o-> o.getNewIndex()。isEmpty(),
    Collectors.reducing(false,Boolean :: logicalOr)) ));
    Map< String,Double> averages = mapOfIndicators.values()。stream()
    .flatMap(Collect ion :: stream)
    .filter(objectDTO - > !)()()()()()()())()()()()()()() :: parseDouble))));


  2. 过滤结果:

     地图< String,Double> (b)收集器集合(b)(ObjectDTO :: getCountryName,$ b $) b)Collectors.mapping(ObjectDTO :: getNewIndex,Collectors.averagingDouble(
    s-> s.isEmpty()?Double.NaN:Double.parseDouble(s)))),
    m-> (m.values()。removeIf(d-> Double.isNaN(d)); return m;}));



I have a map of the format (reference to Finding average using Lambda (Double stored as String))

Map<String, Double> averages=mapOfIndicators.values().stream()
.flatMap(Collection::stream)
.filter(objectDTO -> !objectDTO.getNewIndex().isEmpty())
.collect(Collectors.groupingBy(ObjectDTO::getCountryName,
    Collectors.mapping(ObjectDTO::getNewIndex,
        Collectors.averagingDouble(Double::parseDouble))));

I would like to ignore the ignore the entire country mapping even if one of them is newIndex value for that country is empty?

解决方案

Since Collectors.groupingBy does not allow to skip groups, you either have to analyze the filtering condition in advance so you can filter before performing groupBy or filter the map afterwards (I ignore the third option, implement your own groupingBy collector.

  1. Analyze in advance:

    Map<String, Boolean> hasEmpty=mapOfIndicators.values().stream()
        .flatMap(Collection::stream)
        .collect(Collectors.groupingBy(ObjectDTO::getCountryName,
            Collectors.mapping(o->o.getNewIndex().isEmpty(),
                Collectors.reducing(false, Boolean::logicalOr))));
    Map<String, Double> averages=mapOfIndicators.values().stream()
        .flatMap(Collection::stream)
        .filter(objectDTO -> !hasEmpty.get(objectDTO.getCountryName()))
        .collect(Collectors.groupingBy(ObjectDTO::getCountryName,
            Collectors.mapping(ObjectDTO::getNewIndex,
                Collectors.averagingDouble(Double::parseDouble))));
    

  2. Filter the result:

    Map<String, Double> averages=mapOfIndicators.values().stream()
        .flatMap(Collection::stream)
        .collect(Collectors.collectingAndThen(
            Collectors.groupingBy(ObjectDTO::getCountryName,
                Collectors.mapping(ObjectDTO::getNewIndex, Collectors.averagingDouble(
                    s->s.isEmpty()? Double.NaN: Double.parseDouble(s)))),
            m->{ m.values().removeIf(d->Double.isNaN(d)); return m; }));
    

这篇关于Java - Lambda筛选条件,忽略添加到地图的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆