2017-07-29 96 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>,将转换做每个使用此函数的字符串元素。好消息是,此功能可能会返回您想要的任何类型:Integer,Double,BigDecimalString或您想要的任何其他类型。在以下示例中,我使用的方法等参考:

  • Integer::valueOf到元素转换为Integer
  • Double::valueOf到元素转换为Double
  • String::valueOf到元素转换为String

考虑以下示例:

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);