Java:将一种元素类型的列表转换为另一种类型的列表

15 java element list

我正在编写一个适配器框架,我需要将对象列表从一个类转换为另一个类.我可以遍历源列表来执行此操作

Java:将List <Integer>转换为List <String>的最佳方法

但是,我想知道是否有一种方法可以在迭代目标列表时动态执行此操作,因此我不必遍历列表两次.

Ben*_*ngs 13

回答这个问题适用于您的情况:

import com.google.common.collect.Lists;
import com.google.common.base.Functions

List<Integer> integers = Arrays.asList(1, 2, 3, 4);

List<String> strings = Lists.transform(integers, Functions.toStringFunction());
Run Code Online (Sandbox Code Playgroud)

转换后的列表是原始集合的视图,因此在List访问目标时会发生转换.

  • 如果我们用自定义类来代替 Integer 和 String 呢? (2认同)

Ale*_*lev 12

Java 8方式:

List<String> original = ...;
List<Wrapper> converted = original.stream().map(Wrapper::new).collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

假设Wrapper类有一个接受a的构造函数String.


rho*_*dan 9

作为迭代器模式的替代方法,您可以使用抽象通用映射器类,并仅覆盖转换方法:

  1. 为任何数据类型创建通用集合映射器
  2. [可选]创建一个方法库,在不同的数据类型之间进行转换(并覆盖该方法)
  3. 使用该库

实施:

// Generic class to transform collections
public abstract class CollectionTransformer<E, F> {

    abstract F transform(E e);

    public List<F> transform(List<E> list) {
        List<F> newList = new ArrayList<F>();
        for (E e : list) {
            newList.add(transform(e));
        }
        return newList;
    }
}

// Method that transform Integer to String
// this override the transform method to specify the transformation
public static List<String> mapIntegerToStringCollection(List<Integer> list) {

    CollectionTransformer transformer = new CollectionTransformer<Integer, String>() {
        @Override  
        String transform(Integer e) {
            return e.toString();
        }
    };
    return transformer.transform(list);
}

// Example Usage
List<Integer> integers = Arrays.asList(1,2);
List<String> strings = mapIntegerToStringCollection(integers);
Run Code Online (Sandbox Code Playgroud)

这将是有用的,你必须每次都使用转换,封装过程.因此,您可以轻松地创建集合映射器库.


Kan*_*ath 0

该问题不会重复列表两次。它只迭代一次,并且是迄今为止唯一已知的方法。

您也可以在 google-collections 的 commons-collections 中使用一些转换器类,但它们都在幕后做同样的事情:)以下是一种方法

CollectionUtils.collect(collectionOfIntegers, new org.apache.commons.collections.functors.StringValueTransformer());
Run Code Online (Sandbox Code Playgroud)