gpt4 book ai didi

java - 使用 lambda 过滤泛型集合

转载 作者:行者123 更新时间:2023-12-02 10:37:31 25 4
gpt4 key购买 nike

最后重新表述了问题
-------------------------------------------------------- -

我必须编写两个泛型方法来过滤泛型类型的集合。

首先从集合中删除重复项和可选的空值< ?扩展对象 >.

第二个从集合中删除重复项和可选的空/空白< 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() => ArrayList
设置<联系人> => doFilter() => 设置<联系人>
LinkedHashSet => 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com