【问题标题】:Does collections type conversion util methods already exist in any API?集合类型转换实用程序方法是否已经存在于任何 API 中?
【发布时间】:2025-12-14 11:35:01
【问题描述】:
interface TypeConverter<T, E> {
     T convert(E e);
}
class CollectionUtil() {
     public static <E> List<T> convertToList(List<E> fromList, TypeConverter<T, E> conv) {
     {
            if(fromList== null) return null;
            List<T> newList = new ArrayList<T>(fromList.size())  
            for(E e : fromList) 
            {
                newList.add(conv.convert(e));
            }
            return newList;
     } 
}

上面的代码解释了通过实现 String、Integer 的 TypeConverter 接口从 String 列表转换为 Integer 列表。任何 API(如要设置的列表等)中是否已经存在任何集合转换实用程序方法?

【问题讨论】:

  • Guava has one。相关/欺骗问题:*.com/questions/18524/…
  • 这样的转换是不安全的。所以它们不能成为 Java API 的一部分
  • @AmitD:我看不出它们不安全有什么意义。在显示的代码中没有显式转换,这意味着由于强大的静态类型检查器,在运行时不会引发类型错误。
  • @Jack 在我看来TypeConverter 是不安全的,因为在某些时候,开发人员会将值从一种类型“转换”为另一种类型,从而产生ClassCastExceptions
  • @AmitD:如果 TypeConverter 在参数和返回值上都是通用的并且不使用强制转换,我不明白这怎么可能。使用您的假设,整个 Java 语言是不安全的,因为在某些时候您总是可以进行类型转换:) 只有一种禁止类型转换的语言本质上是安全的。你说开发者,我说开发者可能,但在任何地方都是如此。

标签: java generics collections


【解决方案1】:

在番石榴中:

List<String> strings = Arrays.asList("1", "2", "3");
List<Integer> integers =
        Lists.transform(strings, new Function<String, Integer>() {
            @Override
            public Integer apply(String input) {
                return Integer.parseInt(input);
            }
        });

Maven

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>13.0</version>
</dependency>

Collections 15 package:

final List<Integer> integers =
        ListUtils.transformedList(strings, new Transformer<String, Integer>() {
            @Override
            public Integer transform(String s) {
                return Integer.parseInt(s);
            }
        });

Maven

<dependency>
    <groupId>net.sourceforge.collections</groupId>
    <artifactId>collections-generic</artifactId>
    <version>4.01</version>
</dependency>

Functional Java

List<Integer> integers = List.list("1", "2", "3").map(new F<String, Integer>() {
    @Override
    public Integer f(String s) {
        return Integer.parseInt(s);
    }
});

Maven

<dependency>
    <groupId>org.functionaljava</groupId>
    <artifactId>functionaljava</artifactId>
    <version>3.1</version>
</dependency>

请注意,此库使用不同的集合集。

...Scala 中的奖励:

Seq("1", "2", "3") map {_.toInt}

【讨论】:

  • +1 请注意,Guava 的Lists.transform 的结果是视图,而不是副本。
【解决方案2】:

试试:

【讨论】:

    最近更新 更多