加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 04:43:11 所属栏目:Java 来源:网络整理
导读:使用 java 8流我想将列表转换为如 Java 8 ListV into MapK,V的解决方案中所述的映射.但是,我想过滤以删除具有某些键的条目(例如,如果键为空),而不将值转换为一把钥匙两次. 例如,我可以在收集之前进行过滤,例如 MapString,Choice result = choices.stream().f
使用 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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读