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 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |