Java 8 - 从List中过滤空字符串不起作用

时间:2016-11-15 09:15:28

标签: java java-8 java-stream

我想从字符串列表中删除一个空字符串。

以下是我尝试使用流API:

list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList());

并且空字符串仍然存在于列表中。我错过了什么?

10 个答案:

答案 0 :(得分:21)

filter() 保留与谓词匹配的元素。 Soyou需要反向谓词:

list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList());

这也不会修改原始列表。它将创建原始列表的过滤副本。所以你需要

list = list.stream().filter(item-> !item.isEmpty()).collect(Collectors.toList());

如果要修改原始列表,则应使用

list.removeIf(item -> item.isEmpty());

或只是

list.removeIf(String::isEmpty);

答案 1 :(得分:3)

我怀疑你没有保留结果。返回结果,原始列表不会改变,因为这是函数式编程风格。

list = list.stream().filter(item-> !item.trim().isEmpty()).collect(Collectors.toList());

答案 2 :(得分:2)

也许字符串包含空格?将item -> item.isEmpty()替换为item -> !item.trim().isEmpty()

答案 3 :(得分:1)

你正在收集空元素:)

你想要非空,所以颠倒谓词

List<String> xxx = list.stream().filter(item -> !item.isEmpty()).collect(Collectors.toList());

另外,流不修改原始列表,因此Collect(Collectrors.toList())返回谓词的结果:)

答案 4 :(得分:1)

从Java 11开始,就有了一种新方法Predicate::not

所以您可以这样写:

update m
    set m.mon_hourly_pay_rate = m.mon_hourly_pay_rate*1.1
from monthly_pay m
inner join Employee e
    on e.emp_number=m.emp_number
where e.emp_name = "John Smith";

答案 5 :(得分:0)

您正在删除非空字符串(请检查您的过滤条件)。尝试:

list.stream().filter(item -> !item.isEmpty()).collect(Collectors.toList());

否则,您可能需要检查是否还要删除空白:

list.stream().filter(item -> !item.trim().isEmpty()).collect(Collectors.toList());

答案 6 :(得分:0)

您没有从列表中删除空字符串,而是检索它们。您的过滤条件有误。

试试这样:

List<String> collect = list.stream().filter(item -> !item.trim().isEmpty()).collect(Collectors.toList());

答案 7 :(得分:0)

你可以按照下面的例子,它可以帮助你

String[] firstArray = {"test1", "", "test2", "test4", "", null};

    firstArray = Arrays.stream(firstArray).filter(s -> (s != null && s.length() > 0)).toArray(String[]::new);

答案 8 :(得分:0)

     <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
            <version>3.5-SNAPSHOT</version>
        </dependency>

import org.apache.commons.lang3.StringUtils;
        //Java8 new api
        strings.removeIf(StringUtils::isBlank);
        //stream        strings=strings.stream().filter(StringUtils::isNotBlank).collect(Collectors.toList());

答案 9 :(得分:0)

您的列表可能包含null。所以先用过空检查过滤 然后再次过滤空

    list.stream().filter(item -> null != item).filter(item -> !item.isEmpty()).collect(Collectors.toList());

如果你有apache commons lang lib,请使用Apache StringUtils isNotBlank

list.stream().filter(item -> StrinUtils.isNotBlank(item)).collect(Collectors.toList());