2017-07-29 17 views
3

コンマで区切られた文字列を配列に変換したいです。しかし、場合によっては、整数の解析が必要な場合もあります。 全体をもう一度書くのではなく、mapToDoubleまたはmapToIntを渡す方法はありますか。パラメータとしてJava 8ストリーミングマップ関数を渡します。

return Arrays.stream(test.split(",")).mapToDouble(x -> { 
     if (StringUtils.isEmpty(x)) { 
      return condition ? -1 : 0; 
     } 
     return Double.parseDouble(x); 
}).toArray(); 

return Arrays.stream(test.split(",")).mapToInt(x -> { 
     if (StringUtils.isEmpty(x)) { 
      return condition ? -1 : 0; 
     } 
     return Integer.parseInt(x); 
}).toArray(); 

これを関数にする方法はありますか?汎用関数を使用して適切な配列を格納する方法はありますか?

答えて

3

あなたがStringと変換されますFunction<String, T>を受け入れ、単純な機能でそれを行うことができますこの関数を使用するすべての文字列要素良いことは、この関数は任意のタイプ、つまりIntegerDoubleBigDecimalStringまたは任意の他のタイプを返す可能性があることです。 String

考慮するに要素を変換するDouble

  • String::valueOfに要素を変換するInteger
  • Double::valueOfに要素を変換する

    • Integer::valueOf:以下の例では、私のようなメソッドリファレンスを使用します次の例:

      import java.util.Arrays; 
      import java.util.List; 
      import java.util.Objects; 
      import java.util.function.Function; 
      import java.util.stream.Collectors; 
      
      public class ParsingStringTest { 
      
          public static void main(String[] args) { 
           String str = "1, , 3, 4, 5, , 7, sasd, aaa, 0"; 
      
           List<Double> doubles = parse(str, Double::valueOf); 
           List<Integer> integers = parse(str, Integer::valueOf); 
           List<String> strings = parse(str, String::valueOf); 
      
           System.out.println(doubles); 
           System.out.println(integers); 
           System.out.println(strings); 
      
           Double[] array = doubles.toArray(new Double[doubles.size()]); 
      
           System.out.println(Arrays.toString(array)); 
          } 
      
          public static <T> List<T> parse(String str, Function<String, T> parseFunction) { 
           return Arrays.stream(str.split(",")) 
             .filter(s -> !s.isEmpty()) 
             .map(s -> { 
              try { 
               return parseFunction.apply(s.trim()); 
              } catch (Exception e) {} 
              return null; 
             }) 
             .filter(Objects::nonNull) 
             .collect(Collectors.toList()); 
          } 
      } 
      

      例を以下のためのコンソール出力です:私はそれが役に立てば幸い

      [1.0, 3.0, 4.0, 5.0, 7.0, 0.0] 
      [1, 3, 4, 5, 7, 0] 
      [1, , 3, 4, 5, , 7, sasd, aaa, 0] 
      [1.0, 3.0, 4.0, 5.0, 7.0, 0.0] 
      

  • +0

    エラーが発生してダブルに変換できませんT – user1692342

    +1

    全体のスタックトレースを貼り付けることができますか?どのJavaバージョンを使用していますか? OpenJDK 1.8.0_141でテストしましたが、私のIDEのビデオは次のとおりです。https://youtu.be/OXA3rC15JBg –

    +0

    私はそのエラーを取り除きました。私はそれをこのように呼びます: Double [] result = parse(str、Double :: valueOf); エラーが発生しました:java.lang.ClassCastException:[Ljava.lang.Object; [Ljava.lang.Double;にキャストすることはできません。 – user1692342

    2

    方法はありますが、Javaのジェネリックはプリミティブ型をサポートしていないため、プリミティブはこれ以上使用できません。代わりに、あなたはIntegerDoubleラッパー型を使用することができます。

    public static <T> T[] convert(
         String test, 
         Function<String, T> parser, 
         boolean condition, 
         T ifConditionTrue, 
         T ifConditionFalse, 
         IntFunction<T[]> arrayGenerator) { 
    
        return Arrays.stream(test.split(",")) 
         .map(x -> { 
          if (StringUtils.isEmpty(x)) { 
           return condition ? ifConditionTrue : ifConditionFalse; 
          } 
          return parser.apply(x); 
         }) 
         .toArray(arrayGenerator); 
    } 
    

    次のようにこの方法を使用することができます。

    Integer[] ints = convert("1, ,3", Integer::parseInt, true, -1, 0, Integer[]::new); 
    
    関連する問題