[英]Reducing/Filtering a HashMap<String, List> collection using Java streams API
[英]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()
中, 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)
您正在過濾錯誤的實體:
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.