我们知道Java 8引入了一个新的Stream API, java.util.stream.Collector是定义如何聚合/收集数据stream的接口。 但是,收集器接口是这样devise的: public interface Collector<T, A, R> { Supplier<A> supplier(); BiConsumer<A, T> accumulator(); BinaryOperator<A> combiner(); Function<A, R> finisher(); } 为什么它不是像下面这样devise的? public interface Collector<T, A, R> { A supply(); void accumulate(A accumulator, T value); A combine(A left, A right); R finish(A accumulator); } 后者更容易实现。 devise它作为前者的考虑是什么?
采取以下行示例代码: Set<String> someSet = someColletion.stream().map(p -> p.toString()).collect(Collectors.toSet()); 我想要一个HashSet 。 把一个debugging器的代码,我确实得到一个HashSet 。 我看了一下java.util.stream.Collectors.toSet()来观察下面的代码: public static <T> Collector<T, ?, Set<T>> toSet() { return new CollectorImpl<>((Supplier<Set<T>>) HashSet::new, Set::add, (left, right) -> { left.addAll(right); return left; }, CH_UNORDERED_ID); } 合约保证一个Set ,实现决定一个HashSet ; 看起来合理。 但是,我的实现需要由HashSet保证的恒定时间查找,而不仅仅是任何旧的Set 。 如果toSet()的实现决定使用FooSet ,这完全在它的权限之内,那么我的实现就会受到影响。 这个问题的最佳实践解决scheme是什么?
我正在使用Java 8 lambdaexpression式,并希望使用Collectors toMap来返回一个SortedMap 。 我能想到的最好的办法是用一个mapSupplier于TreeMap::new的dummy mergeFunction和mapSupplier调用下面的Collectors toMap方法。 public static <T, K, U, M extends Map<K, U>> Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier) { BiConsumer<M, T> accumulator = (map, element) -> map.merge(keyMapper.apply(element), valueMapper.apply(element), mergeFunction); return new CollectorImpl<>(mapSupplier, accumulator, mapMerger(mergeFunction), CH_ID); […]
收集器的Javadoc显示如何将stream的元素收集到新列表中。 有没有一个单线程将结果添加到现有的ArrayList中?
我知道如何从Y – > Z “转换”一个简单的Java List ,即: List<String> x; List<Integer> y = x.stream() .map(s -> Integer.parseInt(s)) .collect(Collectors.toList()); 现在我想用一个Map来做基本相同的事情,即: INPUT: { "key1" -> "41", // "41" and "42" "key2" -> "42 // are Strings } OUTPUT: { "key1" -> 41, // 41 and 42 "key2" -> 42 // are Integers } 解决scheme不应该限于String – > Integer 。 […]
如果其中一个值为“null”,则Java 8 Collectors.toMap将引发NullPointerException 。 我不明白这个行为,地图可以包含空指针作为值没有任何问题。 Collectors.toMap值不能为null是否有充分的理由? 此外,是否有一个很好的Java 8的方式来解决这个问题,或者我应该恢复到普通的旧的循环? 我的问题的一个例子: import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.stream.Collectors; class Answer { private int id; private Boolean answer; Answer() { } Answer(int id, Boolean answer) { this.id = id; this.answer = answer; } public int getId() { return id; } public void setId(int id) { this.id = […]