- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
最后重新表述了问题
-------------------------------------------------------- -
我必须编写两个泛型方法来过滤泛型类型的集合。
首先从集合中删除重复项和可选的空值< ?扩展对象 >.
第二个从集合中删除重复项和可选的空/空白< String >。
private <T extends Collection<C>, C extends Object> T removeDuplicatesFromCollection(T collection, boolean skipNull)
{
if(collection == null)
{
return collection;
}
final HashSet<C> tmp = new HashSet<C>();
for(C element : collection)
{
if(element == null && skipNull)
{
continue;
}
else
{
tmp.add(element);
}
}
collection.clear();
collection.addAll(tmp);
return collection;
}
我不知道如何解决这个问题。所以我使用 HashSet 来过滤唯一的、清除原始集合并添加哈希集的所有条目。
首先,我尝试通过流式传输和使用 lambda 表达式来解决这个问题,但也遇到了使用collect()处理的问题
首先,我通过流式传输和使用 lambda 表达式进行了尝试,但没有成功
它确实有效,但我确信一定有更好的方法。
第一种方法是从 Collection 中删除重复项和空条目。我喜欢用 lambda 指令和 apache StringUtils 再次过滤这个列表,但我不知道如何处理收集和泛型类型 T。
private <T extends Collection<String>> T removeDuplicationsFromStringCollection(T collection, boolean skipNull, boolean skipEmpty)
{
if(collection == null)
{
return collection;
}
T removedDuplicates = removeDuplicatesFromCollection(collection, skipNull);
if(removedDuplicates == null || !skipEmpty)
{
return removedDuplicates;
}
else
{
removedDuplicates.().filter(s -> StringUtils.isNotBlank(s)).collect(T::new); <== [X Cannot instantiate the type T ]
}
}
任何人都可以帮助完成这项工作吗?如果有人对第一种方法有更好的解决方案,我也将不胜感激,因为我自己还没有完全满意。
非常感谢
------------[编辑]----------------
我不知道方法输入的集合类型,输出类型必须是集合的输入类型。HashSet => 方法 => HashSet => 返回ArrayList => 方法 => ArrayList => 返回
我不喜欢修改输入集合,但这是我保留集合类型的唯一方法。问题不在于流式传输期间过滤列表,而在于流末尾的collect(),以及根据输入类型创建通用类型。问题是为输出集合保留输入集合的类型。
--------------[改写]------------------
让我重新表述并简化问题,也许我不应该围绕我想做的事情写那么多。有任何有用的提示和技巧,但核心问题没有解决
private <T extends Collection> T doFilter(T pCollection, ....
{
/** removed code for simplifing **/
return pCollection.stream()
/*.filter(....)*/
.collect( Collectors.toCollection( ?>> T <<?? ) );
}
谁能告诉我如何在具有泛型类型的 lambda 中收集(Collectors.toCollection(T)) ?
所以列表<汽车> => doFilter() => 列表<汽车>
ArrayList
设置<联系人> => doFilter() => 设置<联系人>
LinkedHashSet
[T => doFilter() => T]
....
最佳答案
使用 java 8 流 API 确实会带来更简洁的实现:
public <T extends Collection<Object> T removeDuplicatesFromCollectionAndFilterNull(T collection) {
return collection.stream()
.filter(Objects::isNull) // Method Reference to Objects.isNull(object)
.collect(Collectors.toSet()); // Collect to set to remove duplicates
}
类似的方法可以用来解决第二个问题。请注意,collect 方法不采用 lambda 来创建集合(并且 T::new 不起作用,因为 Java 不知道该方法是否有默认构造函数),而是采用 Collector。 This guide might help
关于java - 使用 lambda 过滤泛型集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53171532/
我是一名优秀的程序员,十分优秀!