java - Java 8 Streams 从列表中过滤出空字符串 []?
问题描述
假设我们有 2 个测试字符串 [],类似于:
String[] test = {"","","","",""};
String[] test2 = {"Test","Name", "5.00", "NY", "Single"};
然后我们将它们附加到这样的列表中:
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()
,i
是ArrayList
, 并且它包含("","","","","")
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)
推荐阅读
- maven - 无法在 windows 中安装 maven:“'mvn' 未被识别为内部或外部命令可运行程序或批处理文件”
- javascript - 如何在一个提交按钮中处理两个服务调用
- android - 关于通过 Google Play 控制台发布代号一个应用程序的警告消息 Start To Roll Out Button disabled
- c# - .net 核心中的 IHttpClientFactory
- postgresql - PostgreSQL 11 中的表分区与自动分区创建?
- html - 密码与 Angular CLI 中的模式不匹配
- arcgis - 在哪里可以找到 ArcGIS 服务 url 以及如何创建?如何从服务器上传和查看内容
- spring-boot - jasypt-spring-boot-starter:密码不是 ascii
- vba - 如何检查重复名称,但避免自行激活
- java - 如何将我的一个片段数据传递给同一活动中的另一个片段?