【发布时间】:2017-07-02 01:20:55
【问题描述】:
我有以下功能统一多个集合(包括重复元素):
public static <T> List<T> unify(Collection<T>... collections) {
return Arrays.stream(collections)
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
如果集合的交集有一个类似签名的函数(使用类型相等),那就太好了。例如:
public static <T> List<T> intersect(Collection<T>... collections) {
//Here is where the magic happens
}
我找到了 intersect 函数的实现,但它不使用流:
public static <T> Set<T> intersect(Collection<? extends Collection<T>> collections) {
Set<T> common = new LinkedHashSet<T>();
if (!collections.isEmpty()) {
Iterator<? extends Collection<T>> iterator = collections.iterator();
common.addAll(iterator.next());
while (iterator.hasNext()) {
common.retainAll(iterator.next());
}
}
return common;
}
有没有办法实现类似于使用流的统一功能?我在 java8/stream api 方面不是很有经验,因此一些建议会很有帮助。
【问题讨论】:
-
你认为为什么需要流?
-
纯属好奇!我忘了提到我对 java 8/stream API 真的很陌生,所以我目前正在尝试通过使用 api 来了解更多信息 :)
-
对。就个人而言,我觉得学习这些 API 的最好方法是尝试自己解决这样的问题。试一试,如果遇到困难,请返回一个具体问题,概述您的问题。
-
当前 Java 中 Streams 的实现受到严重限制,因为一个方法只能返回一个值,因此一次处理多个流源非常麻烦(与例如 Haskell 相比,它是微不足道的处理多个无限列表)。
标签: java collections lambda java-8 java-stream