List <String>からList <Integer>(またはNumberを拡張するクラス)への変換

エリゼオ・ソト:

任意のコレクションを取得し、それをNumber(Long、Double、Float、Integerなど)から拡張するユーザー選択可能なクラスのコレクションに変換する非常に汎用的なユーティリティメソッドを作成したい

私は、Googleコレクションを使用してコレクションを変換し、不変リストを返すこのコードを思いつきました。

import java.util.List;

import com.google.common.base.Function;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
/**
     * Takes a {@code List<String>} and transforms it into a list of the
     * specified {@code clazz}.
     * 
     * @param <T>
     * @param stringValues
     *            the list of Strings to be used to create the list of the
     *            specified type
     * @param clazz
     *            must be a subclass of Number. Defines the type of the new List
     * @return
     */
    public static <T extends Number> List<T> toNumberList(List<String> stringValues, final Class<T> clazz) {
        List<T> ids = Lists.transform(stringValues, new Function<String, T>() {
            @SuppressWarnings("unchecked")
            @Override
            public T apply(String from) {
                T retVal = null;
                if (clazz.equals(Integer.class)) {
                    retVal = (T) Integer.valueOf(from);
                } else if (clazz.equals(Long.class)) {
                    retVal = (T) Long.valueOf(from);
                } else if (clazz.equals(Float.class)) {
                    retVal = (T) Float.valueOf(from);
                } else if (clazz.equals(Double.class)) {
                    retVal = (T) Double.valueOf(from);
                } else {
                    throw new RuntimeException(String.format("Type %s is not supported (yet)", clazz.getName()));
                }
                return retVal;
            }
        });
        return ImmutableList.copyOf(ids);
    }

次のように使用できます。

// Convert List<String> to List<Long>
List<Long> ids = MiscUtils.toNumberList(productIds, Long.class);

私のコードはやりすぎですか、それともどのように単純化し、同時に十分に汎用性を維持しますか?

ColinD:

このコードの最も重要な側面はFunction、メソッド自体とは対照的にです。またが作成されたときにFunctionどのタイプのNumber戻り値を返したいのかすでにわかっているので本文で許可するサブクラスを切り替えることは意味がないと思いますFunctionたとえば、が指定された場合にメソッドが失敗することも、少し問題がありますBigInteger.class

これを踏まえて、私が行うことは、ユーティリティクラスを作成し(それをNumbers呼びましょう)、それぞれをを特定のタイプとして解析するためにFunctionenumシングルトンにすることができる)を返すメソッドを提供することStringですNumberあれは:

public class Numbers {
  public static Function<String, Integer> parseIntegerFunction() { ... }
  public static Function<String, Long> parseLongFunction() { ... }
  ...
}

それらはそれぞれ次のようなものを実装することができます:

public static Function<String, Integer> parseIntegerFunction() {
  return ParseIntegerFunction.INSTANCE;
}

private enum ParseIntegerFunction implements Function<String, Integer> {
  INSTANCE;

  public Integer apply(String input) {
    return Integer.valueOf(input);
  }

  @Override public String toString() {
    return "ParseIntegerFunction";
  }
}

これは、ユーザーが望む方法で使用できます。

List<String> strings = ...
List<Integer> integers = Lists.transform(strings, Numbers.parseIntegerFunction());

このアプローチには、いくつかの利点があります。

  • Function...での切り替えは必要ありません。作成する数値のタイプはわかっているので、それを実行します。もっと早く。
  • より柔軟で、Functionどこでも使用できます...ユーザーはメソッドのように使用する必要がありません(変換された値をにコピーします)ImmutableList
  • Function実際に許可したいs のみを作成します。BigInteger解析関数がない場合、ユーザーはそれを呼び出すことができません。これは、例のようにコンパイル時にそれを実行し、実行時に失敗することを完全に正当にすることとは対照的です。

補足として、ImmutableListbe ImmutableListではなくbe を返すメソッドの戻り値の型を作成することをお勧めしますList。これは、メソッドのクライアントに役立つ情報を提供します。

編集:

より動的もの本当に必要場合(つまり、sをそのClass<T extends Number>に変換できるようにいくつかのインスタンスを持つクラスが必要な場合)、次のようなlookupメソッドを追加することもできます。StringNumber

public static <T extends Number> Function<String, T> parseFunctionFor(Class<T> type) {
  // lookup the function for the type in an ImmutableMap and return it
}

ただし、Number提供しないサブクラスがある場合、これには元のメソッドと同じ問題がありますFunctionまた、これが役立つ多くの状況があるようにも思われません。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

List <Integer>からList <String>への変換

分類Dev

Java List <String>からMap <String、Integer>への変換

分類Dev

Java List <String>からMap <String、Integer>への変換

分類Dev

JavaRDD<List<String>> から JavaPairRDD<String, Integer> への変換

分類Dev

Map <String、List <Integer >>をMultiValueMap <String、Integer>に変換できますか

分類Dev

Converting list to string then integer

分類Dev

HashMap<Integer, List<String>> を HashMap<String, HashSet<Integer>> に変換する

分類Dev

List <String>をList <Integer>に変換する方法は?

分類Dev

how to determine an integer in a string list

分類Dev

Guavaの関数を使用してList <List <String >>をList <Integer>に変換します

分類Dev

List <String>をList <Integer>に直接変換します

分類Dev

Map <Integer、List <String >>の空間的な複雑さはどれくらいですか?

分類Dev

List <String>をMap <String、Integer>に変換します

分類Dev

Map <String、List <String >>からPair <String、String>へ

分類Dev

LINQは、List <List <string >>からList <string>を取得します。

分類Dev

Java8ストリームを使用してString [] []からMap <String、List <Integer >>を作成します

分類Dev

Java / Observable <List <String >>からList <String>への変換

分類Dev

Map <String、List <Integer >>をJSONからJPAにマップするにはどうすればよいですか?

分類Dev

List <string>からDictionary <string、string>へ

分類Dev

Javaストリームを使用したList <String>からStringへの変換

分類Dev

Observable<List<String>> を RxJava マッピングで Observable<List<Integer>> に変換する

分類Dev

List <String>からString ..へのJava 8

分類Dev

List <String>からString ..へのJava 8

分類Dev

List <string>からstring [、]

分類Dev

JavaのList <Integer []>とList <List <Integer >>の違いは何ですか

分類Dev

List <List <Object >>からString [] []へ。方法はありますか?

分類Dev

C#-Lambda / LINQ-Dictionary <string、string> []からList <string []>への変換

分類Dev

Java 8ストリームを使用して、Map <String、Map <String、List <Person >>>をMap <Integer、Map <String、Integer >>に変換する方法は?

分類Dev

List <String>からList <Character> Javaに変換する

Related 関連記事

  1. 1

    List <Integer>からList <String>への変換

  2. 2

    Java List <String>からMap <String、Integer>への変換

  3. 3

    Java List <String>からMap <String、Integer>への変換

  4. 4

    JavaRDD<List<String>> から JavaPairRDD<String, Integer> への変換

  5. 5

    Map <String、List <Integer >>をMultiValueMap <String、Integer>に変換できますか

  6. 6

    Converting list to string then integer

  7. 7

    HashMap<Integer, List<String>> を HashMap<String, HashSet<Integer>> に変換する

  8. 8

    List <String>をList <Integer>に変換する方法は?

  9. 9

    how to determine an integer in a string list

  10. 10

    Guavaの関数を使用してList <List <String >>をList <Integer>に変換します

  11. 11

    List <String>をList <Integer>に直接変換します

  12. 12

    Map <Integer、List <String >>の空間的な複雑さはどれくらいですか?

  13. 13

    List <String>をMap <String、Integer>に変換します

  14. 14

    Map <String、List <String >>からPair <String、String>へ

  15. 15

    LINQは、List <List <string >>からList <string>を取得します。

  16. 16

    Java8ストリームを使用してString [] []からMap <String、List <Integer >>を作成します

  17. 17

    Java / Observable <List <String >>からList <String>への変換

  18. 18

    Map <String、List <Integer >>をJSONからJPAにマップするにはどうすればよいですか?

  19. 19

    List <string>からDictionary <string、string>へ

  20. 20

    Javaストリームを使用したList <String>からStringへの変換

  21. 21

    Observable<List<String>> を RxJava マッピングで Observable<List<Integer>> に変換する

  22. 22

    List <String>からString ..へのJava 8

  23. 23

    List <String>からString ..へのJava 8

  24. 24

    List <string>からstring [、]

  25. 25

    JavaのList <Integer []>とList <List <Integer >>の違いは何ですか

  26. 26

    List <List <Object >>からString [] []へ。方法はありますか?

  27. 27

    C#-Lambda / LINQ-Dictionary <string、string> []からList <string []>への変換

  28. 28

    Java 8ストリームを使用して、Map <String、Map <String、List <Person >>>をMap <Integer、Map <String、Integer >>に変換する方法は?

  29. 29

    List <String>からList <Character> Javaに変換する

ホットタグ

アーカイブ