ArrayList <Object>をArrayList <String>に変換するにはどうすればよいですか?


94
ArrayList<Object> list = new ArrayList<Object>();
list.add(1);
list.add("Java");
list.add(3.14);
System.out.println(list.toString());

私は試した:

ArrayList<String> list2 = (String)list; 

しかし、コンパイルエラーが発生しました。


5
なぜそうしたいのですか?安全ではないということです。例を見てください。
athspk、2011年

6
文字列以外をリストに入れています。それらを強制的に文字列にした場合に何が起こるかについてのあなたの期待は何ですか?
Ben Zotto、2011年

5
私はあなたが意味したと思います:ArrayList <String> list2 =(ArrayList <String>)list;
コスティシウダトゥ2011年

回答:


130

これは実際には文字列のリストではないので、最も簡単な方法はそれをループして、各アイテムを自分で新しい文字列のリストに変換することです。

List<String> strings = list.stream()
   .map(object -> Objects.toString(object, null))
   .collect(Collectors.toList());

または、まだJava 8を使用していない場合:

List<String> strings = new ArrayList<>(list.size());
for (Object object : list) {
    strings.add(Objects.toString(object, null));
}

または、Java 7をまだ使用していない場合:

List<String> strings = new ArrayList<String>(list.size());
for (Object object : list) {
    strings.add(object != null ? object.toString() : null);
}

java.util.List実装ではなく、インターフェイス(この場合)に対して宣言する必要があることに注意してください。


6
この実装では、null値がどのように保持されるかが気に入っています。

4
を使用する場合String.valueOf(object)、そのobject != null ? object.toString() : nullことを行う必要はありません
user219882 '28

2
@Tomas:"null"リテラルの代わりに値を含む文字列を追加しますnull。それが望ましいかどうかは、ビジネス要件にさらに依存します。大きなバグになる可能性があるため、私にはまったく受け入れられませんでした。
BalusC 2012年

1
@Tomas:まったく"null"ありませんnullnullJavaで特別な意味を持っています。if (item.equals("null"))後でチェックするときに強制されても意味がありません。
BalusC 2012年

1
@Tomas:この方法でJavaの強い型付けの性質を打ち負かすだけです。しかし、言ったように、それが望ましいかどうかはビジネス要件に依存します。私にとっては、それは受け入れがたいことです。やりたいことは何でもして、時間が教えてくれます:)
BalusC '28

18

それを行うのは安全ではありません!
あなたが持っていたら想像してみてください:

ArrayList<Object> list = new ArrayList<Object>();
list.add(new Employee("Jonh"));
list.add(new Car("BMW","M3"));
list.add(new Chocolate("Twix"));

これらのオブジェクトのリストを任意のタイプに変換しても意味がありません。


1
Object#toString()メソッドがオーバーライドされていない限り。ただし、人間による表示以外の目的でXからStringへの型変換全体は、実際にはあまり意味がありません。
BalusC 2011年

13

あなたがそれを汚いやり方でしたいなら、これを試してください。

@SuppressWarnings("unchecked")
public ArrayList<String> convert(ArrayList<Object> a) {
   return (ArrayList) a;
}

利点:すべてのオブジェクトを繰り返し処理しないことで、時間を節約できます。

欠点:足に穴ができる可能性があります。


12

guavaの使用:

List<String> stringList=Lists.transform(list,new Function<Object,String>(){
    @Override
    public String apply(Object arg0) {
        if(arg0!=null)
            return arg0.toString();
        else
            return "null";
    }
});

11

Java 8を使用すると、次のことができます。

List<Object> list = ...;
List<String> strList = list.stream()
                           .map( Object::toString )
                           .collect( Collectors.toList() );

10

ワイルドカードを使用して、次のようにこれを行うことができます

ArrayList<String> strList = (ArrayList<String>)(ArrayList<?>)(list);

8

ここにグアバを使用した別の選択肢があります

List<Object> lst ...    
List<String> ls = Lists.transform(lst, Functions.toStringFunction());

5

型ではないArrayList<String> list2 = (String)list;ため、コードはコンパイルされません。しかし、それだけが問題ではありません。list2String


0

Java 8ラムダを使用:

ArrayList<Object> obj = new ArrayList<>();
obj.add(1);
obj.add("Java");
obj.add(3.14);

ArrayList<String> list = new ArrayList<>();
obj.forEach((xx) -> list.add(String.valueOf(xx)));

0

With Java Generics Xのリストを受け取り、Xを拡張または実装するTのリストを返しますSweet!

    // the cast is is actually checked via the method API
@SuppressWarnings("unchecked")
public static <T extends X, X> ArrayList<T> convertToClazz(ArrayList<X> from, Class<X> inClazz, Class<T> outClazz) {
    ArrayList<T> to = new ArrayList<T>();
    for (X data : from) {
        to.add((T) data);
    }
    return to;
}

0

簡単な解決策:

List<Object> lst  =listOfTypeObject;   
ArrayList<String> aryLst = new ArrayList<String>();
    for (int i = 0; i < lst.size(); i++) {
        aryLst.add(lst.get(i).toString());
    }

注:これは、リストにデータ型Stringのすべての要素が含まれている場合に機能します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.