Java 8流从列表中过滤出空字符串[]<;字符串[]>;?

Java 8流从列表中过滤出空字符串[]<;字符串[]>;?,java,java-8,stream,java-stream,Java,Java 8,Stream,Java Stream,假设我们有2个测试字符串[],类似于: String[] test = {"","","","",""}; String[] test2 = {"Test","Name", "5.00", "NY", "Single"}; 然后我们将它们添加到如下列表中: List<String[]>

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

String[] test = {"","","","",""};
String[] test2 = {"Test","Name", "5.00", "NY", "Single"};
然后我们将它们添加到如下列表中:

List<String[]> testList = new ArrayList<>();
testList.add(test);
testList.add(test2);
i->中!i、 isEmpty()
i
ArrayList
,它包含
(“”,“”,“”,“”,“”,“”),如果它不是空的,您可以检查索引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)

!i、 isEmpty()
i
ArrayList
,它包含
(“”,“”,“”,“”,“”,“”),如果它不是空的,您可以检查索引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);
}
publicstaticvoidmain(字符串[]args)
{
字符串[]测试={“”、“”、“”、“”、“”};
字符串[]test2={“Test”,“Name”,“5.00”,“NY”,“Single”};
字符串[]test3={“Test”,“Name”,“13.00”,“NY”,“Single”};
List testList=new ArrayList();
testList.add(test);
testList.add(test2);
testList.add(test3);
double sum=testList.stream()
.map(数组::asList)
.filter(i->i.size()>2&&!i.get(2).isEmpty())
.maptouble(columnsPerRow->Double.parseDouble(columnsPerRow.get(2)))
.sum();
系统输出打印项数(总和);
}
按预期生成
18.0


筛选阶段删除短于2个元素或第2个元素为空的数组。

您在错误的实体上筛选:

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);
}
publicstaticvoidmain(字符串[]args)
{
字符串[]测试={“”、“”、“”、“”、“”};
字符串[]test2={“Test”,“Name”,“5.00”,“NY”,“Single”};
字符串[]test3={“Test”,“Name”,“13.00”,“NY”,“Single”};
List testList=new ArrayList();
testList.add(test);
testList.add(test2);
testList.add(test3);
double sum=testList.stream()
.map(数组::asList)
.filter(i->i.size()>2&&!i.get(2).isEmpty())
.maptouble(columnsPerRow->Double.parseDouble(columnsPerRow.get(2)))
.sum();
系统输出打印项数(总和);
}
按预期生成
18.0

“筛选”阶段将删除短于2个元素或第2个元素为空的数组。

根据您的说法,筛选出每个标记中包含空值的字符串[]

输出为:

5.0

我的代码只过滤掉所有值都是空字符串的字符串数组。因此,如果美元值为“
,并且数组包含其他非空字符串,则会出现异常。这正是您所需要的,一个不带美元值的数组只需要包含空字符串。为了验证。您可能希望捕获
NumerFormatException
并报告验证错误。或者在进行计算之前验证流。

用你的话来说,过滤掉每个标记中包含空值的字符串[]

输出为:

5.0


我的代码只过滤掉所有值都是空字符串的字符串数组。因此,如果美元值为“
,并且数组包含其他非空字符串,则会出现异常。这正是您所需要的,一个不带美元值的数组只需要包含空字符串。为了验证。您可能希望捕获
NumerFormatException
并报告验证错误。或者在进行计算之前验证流。

我可以问一下.filter(I->I.size()>1)部分的作用吗?当输入数组的元素少于2个时,它会引发
索引自动边界异常,从而阻止您尝试调用
get(2)
。如果可以证明输入数组都有2个以上的元素,那么可以忽略它。另外,我有一个输入错误,我的意思是
I.size()>2
。修正了。非常感谢,我以前确实使用过。filter(i->!i.get().isEmpty)),但出于某种原因,我试图通过过滤掉其中的每个标记而不是重要的标记来删除整个字符串[],真让我感到羞耻哈哈谢谢though@azro的确如此,但即使是
映射(Arrays::asList)
也完全没有必要。这个任务可以像
testList.stream().map(a->a.length>2?a[2]:“”)一样简单。filter(s->!s.isEmpty()).mapToDouble(Double::parseDouble)。sum()
我可以问一下.filter(I->I.size()>1)部分做什么吗?当输入数组的元素少于2个时,它可以阻止您尝试调用
get(2)
,这将抛出一个
索引outofboundsException
。如果可以证明输入数组都有2个以上的元素,那么可以忽略它。另外,我有一个输入错误,我的意思是
I.size()>2
。修正了。非常感谢,我以前确实使用过。filter(i->!i.get().isEmpty)),但出于某种原因,我试图通过过滤掉其中的每个标记而不是重要的标记来删除整个字符串[],真让我感到羞耻哈哈谢谢though@azro的确如此,但即使是
映射(Arrays::asList)
也完全没有必要。这个任务可以像
testList.stream().map(a->a.length>2?a[2]:“”)一样简单地完成。filter(s->!s.isEmpty()).mapToDouble(Double::parseDouble)。sum()
有了上面的答案,我就不能添加你的.filter(arr->!Arrays.stream(arr)。allMatch(String::isEmpty))以及涵盖这两种情况?我不确定您指的是哪两种情况,或者结合两个答案会赢得什么,但是的,您肯定可以做到。有了上面的答案,我不能添加您的.filter(arr->!Arrays.stream(arr).allMatch(String::isEmpty))也包括这两种情况?我不确定你指的是哪两种情况,或者结合两种answ你会赢得什么
    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);