首页
学习
活动
专区
圈层
工具
发布

过滤器
EN

Stack Overflow用户
提问于 2019-06-20 17:19:23
回答 3查看 1.5K关注 0票数 5

我有密码:

代码语言:javascript
复制
static void doSmth() {
    ArrayList<String> list = new ArrayList<>();
    for (int i = 0; i < 30; i++) {
        list.add(String.valueOf(i));
    }
    list.stream().filter("1329"::contains).map(s -> s + "a").forEach(System.out::println);
}

我为什么要:

代码语言:javascript
复制
 1a
 2a
 3a
 9a
 13a
 29a

我期望得到一个空输出,因为list不包含"1329“。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-06-20 17:22:44

因为

代码语言:javascript
复制
.filter("1329"::contains)

均值

代码语言:javascript
复制
.filter(s -> "1329".contains(s))

代码语言:javascript
复制
.filter(s -> s.contains("1329"))

我猜你认为这意味着。

所以你的名单上有:

代码语言:javascript
复制
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, ... 25, 26, 27, 28, 29]
    ^  ^  ^                 ^               ^                           ^

哪个"1329"包含1,2, 3, 9, 13 and 29

票数 11
EN

Stack Overflow用户

发布于 2019-06-20 17:22:14

这是因为当您从0迭代到29时,.contains只是检查列表中的每个单独元素是否存在于字符串1329中。

从1,2,3.它们返回true,因此它们被映射并附加"a“。如果要检查整个字符串1329是否存在,请使用.equals()

代码语言:javascript
复制
filter("1329"::equals)
票数 2
EN

Stack Overflow用户

发布于 2019-06-22 08:56:48

您获得了上面的输出,因为您使用"1329“Java字符串来检查它是否包含列表中的任何字符串。因为字符串"1329“包含"1”、"2“、"3”、"9“、"13”、"29",所以它会过滤掉它们,然后将"a“添加到每个筛选的字符串中。

为了检查列表中是否包含"1329",可以在java.utit.List上直接使用can ()方法。它应该获取空集,因为列表不包含"1329“字符串。

为了从列表中获取等于"1329“的字符串,可以使用filter方法和Strings方法。

代码语言:javascript
复制
list
    .stream()
    .filter(s -> "1329".equals(s))
    .map(s -> s + "a")
    .forEach(System.out::println);

现在,在您的例子中,由于列表不包含"1329“字符串,上面的代码将不会给出任何输出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56691000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档