繁体   English   中英

Java Stream API过滤器

[英]Java Stream API filter

我有代码:

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);
}

为什么我得到:

 1a
 2a
 3a
 9a
 13a
 29a

我期望一个空输出,因为列表不包含“1329”。

因为

.filter("1329"::contains)

意思

.filter(s -> "1329".contains(s))

.filter(s -> s.contains("1329"))

我想你认为这意味着。

所以你的清单包含:

[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

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

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

filter("1329"::equals)

您正在获得上述输出,因为您正在使用“1329”Java String来检查它是否包含列表中的任何字符串。 由于字符串“1329”包含[“1”,“2”,“3”,“9”,“13”,“29”],因此它将它们过滤掉,然后您将“a”附加到每个过滤后的字符串。

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

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

list
    .stream()
    .filter(s -> "1329".equals(s))
    .map(s -> s + "a")
    .forEach(System.out::println);

现在,在您的情况下,上面的代码将不会输出任何内容,因为列表不包含“1329”字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM