Java Stream API过滤器

时间:2019-06-20 17:19:23

标签: java lambda java-8 java-stream

我有代码:

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”。

3 个答案:

答案 0 :(得分:10)

因为

.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

答案 1 :(得分:2)

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

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

filter("1329"::equals)

答案 2 :(得分:1)

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

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

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

cameraCharacteristics.get(CameraCharacteristics.SENSOR_ORIENTATION)

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