开发者社区> 问答> 正文

Java泛型方法来过滤和查找列表中的第一个元素

private Feature findFeature(String name, List<Feature> list) {
    for (Feature item : list) {
        if (item.getName().equals(name)) {
            return  item;
        }
    }
    return null;
}

我还有其他10种这样的方法。相同的签名,相同的逻辑。唯一不同的是List参数使用不同的对象,例如List list,或List

list等。所有对象中都有一个getName()方法。我想创建一个通用方法并删除所有其他方法。

如果我使用这样的东西,

private <T> T findInList(String name, List<T> list) {

我没有访问该getName()方法。创建此方法的最简单方法是什么?反射API是唯一的选择吗?

编辑:

我发现了我做的错误。像这样工作正常:

for (FeatureEntity entity : data.getFeatures()) {
    Predicate<Feature> filter = f -> f.getName().equalsIgnoreCase(entity.getName());
    if (entity.getFeatureId() != null && findInList(featureList, filter) == null) {
        FeatureEntity n = new FeatureEntity();
        n.setId(entity.getId());
        // ...
    }
}

问题来源:Stack Overflow

展开
收起
montos 2020-03-22 14:17:12 1953 0
1 条回答
写回答
取消 提交回答
  • 您可以创建采用通用列表的通用方法,以Predicate在过滤后获取第一个匹配项

    private <T> T findFeature(List<T> list, Predicate<T> predicate) {
        return list.stream().filter(predicate).findFirst().orElse(null);
    }
    

    然后Predicate使用所需的类型创建并调用该方法

    Predicate< Feature > filter = f->f.getName().equalsIgnoreCase(name);
    findFeature(list,filter);
    

    另一方面,也可以返回Optional 而不是null找不到元素时返回:

    private <T> Optional<T> findFeature(List<T> list, Predicate<T> predicate) {
        return list.stream().filter(predicate).findFirst();
    }
    

    回答来源:Stack Overflow

    2020-03-22 14:18:11
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
The Reactive Cloud Native Arch 立即下载
JAVA开发手册1.5.0 立即下载