java 8 - Arrays.stream()。filter过滤掉空字符串并转换为数组

时间:2018-05-22 03:35:10

标签: java collections java-8

我有一个例子如下。我只想转换由','分隔的字符串,并将其转换为长数组而不使用空字符串。 productIdParams包含[1],但是当我执行此操作时,我会遇到异常。

  

java.lang.System.arraycopy(Native Method)中的java.lang.ArrayStoreException   java.util.stream.SpinedBuffer.copyInto(SpinedBuffer.java:194)at at   java.util.stream.Nodes $ SpinedNodeBuilder.copyInto(Nodes.java:1290)at at   java.util.stream.SpinedBuffer.asArray(SpinedBuffer.java:215)at at   java.util.stream.Nodes $ SpinedNodeBuilder.asArray(Nodes.java:1296)at at   java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:439)

String test = "1,";
String[] productIdParams = Iterables.toArray(com.google.common.base.Splitter.on(",").omitEmptyStrings().split(test), String.class);
try {
    Long[] productIds = Arrays.stream(productIdParams).filter(productId -> !productId.isEmpty()).toArray(Long[]::new);
        System.out.println(productIds[0]);
} catch (Exception e) {
    e.printStackTrace();
}

有什么不对吗?

感谢。

3 个答案:

答案 0 :(得分:6)

您正试图从Long[]制作String[],但这是不允许的。 而是使用map中间操作将String值转换为Long个对象。

Arrays.stream(productIdParams)
      .filter(productId -> !productId.isEmpty())
      .map(Long::parseLong)
      .toArray(Long[]::new);

答案 1 :(得分:2)

您忘了将public class Public{ public class subPublic{ //modify access modifiers } } 转换为String

Long

调用Long[] productIds = Arrays.stream(productIdParams) .filter(productId -> !productId.isEmpty()) .map(Long::parseLong) .toArray(Long[]::new); 时,抛出异常,因为基础数据的类型和大小不同

答案 2 :(得分:1)

保持简单

String test = "1,,2,";
    String[] productIdParams = test.split(",");
    try  {
        Long[] productIds = Arrays.stream(productIdParams).filter(productId -> !productId.isEmpty()).map( Long::parseLong).toArray(Long[]::new);
        System.out.println(productIds);
    } catch (Exception e) {
        e.printStackTrace();
    }

您的.filter将从数组中删除空格,而.map会将您的字符串转换为地图