使用
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函数中执行逻辑
解决方法
这是您想要的自定义收藏家:
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 举报,一经查实,本站将立刻删除。