微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 将List转换为Map并过滤null键

使用 java 8流我想将列表转换为如 Java 8 List<V> into Map<K,V>解决方案中所述的映射.但是,我想过滤以删除具有某些键的条目(例如,如果键为空),而不将值转换为一把钥匙两次.

例如,我可以在收集之前进行过滤,例如

Map<String,Choice> result =
    choices.stream().filter((choice) -> choice.getName() != null).collect(Collectors.toMap(Choice::getName,Function.<Choice>identity());

在我的例子中,获取密钥的逻辑比简单地获取字段属性更复杂,我想避免在过滤器中首先执行逻辑,并且再次在Collectors.toMap的keyMapper函数中执行逻辑

如何使用自定义keyMapper函数将列表转换为地图并根据新键过滤某些值?

解决方法

这是您想要的自定义收藏家:

public class FilteredKeyCollector<T,K,V> implements Collector<T,Map<K,V>,V>> {

    private final Function<? super T,? extends K> keyMapper;
    private final Function<? super T,? extends V> valueMapper;
    private final Predicate<K> keyFilter;
    private final EnumSet<Collector.characteristics> characteristics;

    private FilteredKeyCollector(Function<? super T,? extends K> keyMapper,Function<? super T,? extends V> valueMapper,Predicate<K> keyFilter) {

        this.keyMapper = keyMapper;
        this.valueMapper = valueMapper;
        this.keyFilter = keyFilter;
        this.characteristics = EnumSet.of(Collector.characteristics.IDENTITY_FINISH);
    }

    @Override
    public supplier<Map<K,V>> supplier() {
        return HashMap<K,V>::new;
    }

    @Override
    public BiConsumer<Map<K,T> accumulator() {
        return (map,t) -> {
            K key = keyMapper.apply(t);
            if (keyFilter.test(key)) {
                map.put(key,valueMapper.apply(t));
            }
        };
    }

    @Override
    public BinaryOperator<Map<K,V>> combiner() {
        return (map1,map2) -> {
            map1.putAll(map2);
            return map1;
        };
    }

    @Override
    public Function<Map<K,V>> finisher() {
        return m -> m;
    }

    @Override
    public Set<Collector.characteristics> characteristics() {
        return characteristics;
    }
}

并使用它:

Map<String,Choice> result = choices.stream()
    .collect(new FilteredKeyCollector<>(
                Choice::getName,// key mapper
                c -> c,// value mapper
                k -> k != null));   // key filter

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐