【问题标题】:Ready solution for converting raw collections to generic将原始集合转换为通用集合的现成解决方案
【发布时间】:2018-12-26 03:29:18
【问题描述】:

我想知道是否有现成的解决方案,将原始集合(List、Set 等)转换为通用集合(List、Set 等)。我已经为它写了自己的自行车:

public <T> List<T> filterInstancesOfClass(List list, Class<T> clazz) {
    List<T> generifiedList = new ArrayList<T>();
    for (Object o : list) {
        if (clazz.isInstance(o)) {
            generifiedList.add(clazz.cast(o));
        }
    }
    return generifiedList;
}

但我敢肯定,在流行的库中应该有现成的解决方案,可以与集合(Apache、Guava)一起使用。你认识一个吗?

UPD。不幸的是,我不能使用 Java 8,所以我正在寻找 JDK 之外的现成解决方案。

【问题讨论】:

  • 使用 Streams API 会更优雅。它不会转换任何东西,但会过滤。
  • 如果只是为了“打字”,为什么需要这个逻辑?你可以投。循环中的代码除了检查clazz 是否与集合中的每个条目兼容之外什么都不做。但这不仅仅是“类型转换”

标签: java apache collections guava apache-commons


【解决方案1】:

没有现成的解决方案,但您可以像这样在一行中执行相同的操作:

public <T> List<T> filterInstancesOfClass(List<?> list, Class<T> clazz) {
    return list.stream().filter(p -> clazz.isInstance(p)).map(p -> clazz.cast(p)).collect(Collectors.toList());
}

这有助于立即明确您的方法正在过滤兼容的对象。

【讨论】:

    【解决方案2】:

    如果您正在寻找非常短的内容,您可以像这样使用jOOλSeq.ofType()

    Seq.seq(list).ofType(clazz).toList()
    

    编辑:嗯,在 JDK 6 或 JDK 7 上,您可以像这样使用 Guava 20.0 及其 Iterables.filter 方法:

    public <T> List<T> filterInstancesOfClass(List<?> list, Class<T> clazz) {
        return Lists.newArrayList(Iterables.filter(list, clazz));
    }
    

    如果您不需要返回给我的Lists 可变,您可以将Lists.newArrayList 替换为ImmutableList.copyOf

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-15
      • 2010-10-16
      • 1970-01-01
      • 2012-05-11
      相关资源
      最近更新 更多