繁体   English   中英

Java 8 Streams 从 List 中过滤出空 String[]<string[]> ?</string[]>

[英]Java 8 Streams filtering out empty String[] from List<String[]>?

假设我们有 2 个测试字符串 [],类似于:

String[] test = {"","","","",""};
String[] test2 = {"Test","Name", "5.00", "NY", "Single"};

然后我们把它们 append 放到一个这样的列表中:

List<String[]> testList = new ArrayList<>();
testList.add(test);
testList.add(test2);

我试图做的目标是使用 Java 8 个流在每个 String[] 的索引 2 中找到支付的美元总和。 但我似乎无法过滤掉每个索引中包含空值的 String[]。 这是我的尝试:

public static void main(String[] args) {
        String[] test = {"","","","",""};
        String[] test2 = {"Test","Name", "5.00", "NY", "Single"};
        List<String[]> testList = new ArrayList<>();
        testList.add(test);
        testList.add(test2);
        System.out.println(testList);
        testList.stream().map(Arrays::asList).filter(i -> !i.isEmpty())
                                             .mapToDouble(columnsPerRow -> 
                                                Double.parseDouble(columnsPerRow.get(2)))
                                             .sum();
        System.out.println(testList);
    }

我尝试过滤它是使用filter(i ->.i.isEmpty())

它抛出的错误仍然是:

Exception in thread "main" java.lang.NumberFormatException: empty String
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1842)
    at sun.misc.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
    at java.lang.Double.parseDouble(Double.java:538)
    at Main.lambda$main$0(Main.java:23)
    at java.util.stream.ReferencePipeline$6$1.accept(ReferencePipeline.java:244)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1382)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:482)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:472)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.DoublePipeline.collect(DoublePipeline.java:500)
    at java.util.stream.DoublePipeline.sum(DoublePipeline.java:411)
    at Main.main(Main.java:23)

i ->.i.isEmpty()中, iArrayList ,它包含("","","","","") si 它不是空的,您可以检查索引处的值2、你可以这样做

double r = testList.stream().map(Arrays::asList)
                   .filter(i -> !i.isEmpty())              // ensure list not empty
                   .map(i -> i.get(2))                     // keep only 3rd element
                   .filter(i -> !i.isEmpty())              // ensure string isn't empty
                   .mapToDouble(Double::parseDouble)       // map to double
                   .sum();

第一个.filter(i ->.i.isEmpty())可以替换为.filter(i -> i.size() >= 3)

您正在过滤错误的实体:

public static void main(String[] args)
{
    String[] test = {"","","","",""};
    String[] test2 = {"Test","Name", "5.00", "NY", "Single"};
    String[] test3 = {"Test","Name", "13.00", "NY", "Single"};
    List<String[]> testList = new ArrayList<>();
    testList.add(test);
    testList.add(test2);
    testList.add(test3);
    double sum = testList.stream()
                    .map(Arrays::asList)
                    .filter(i -> i.size() > 2 && !i.get(2).isEmpty())
                    .mapToDouble(columnsPerRow -> Double.parseDouble(columnsPerRow.get(2)))
                    .sum();
    System.out.println(sum);
}

按预期生成18.0

过滤器阶段删除小于 2 个元素或第 2 个元素为空的 arrays。

相信你的话,过滤掉每个索引中包含空值的 String[]。

    String[] test = {"","","","",""};
    String[] test2 = {"Test","Name", "5.00", "NY", "Single"};

    double total = Stream.of(test, test2)
            .filter(arr -> !Arrays.stream(arr).allMatch(String::isEmpty))
            .mapToDouble(arr -> Double.parseDouble(arr[2]))
            .sum();
    
    System.out.println(total);

Output 是:

5.0

我的代码只过滤掉字符串 arrays ,其中所有值都是空字符串。 因此,如果美元值为""并且数组包含其他非空字符串,它将异常中断。 没有美元值的数组需要只保存空字符串,这就是您应该想要的。 为了验证。 您可能想要捕获NumerFormatException并报告验证错误。 或者在进行计算之前验证 stream。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM