如何使用Java 8流和值的开头数组过滤列表

时间:2019-05-28 06:32:01

标签: java java-8 java-stream startswith

我有2个列表,一个包含数字列表,另一个包含名称列表。我在名称的开头加上了第一个列表中的数字,然后加上了下划线。我想根据第一个列表中找到的所有数字过滤第二个列表。

我尝试过的。

List<String> numberList = new ArrayList<>();
numberList.add("1_");
numberList.add("9_");

List<String> nameList = new ArrayList<>();
nameList.add("1_John");
nameList.add("2_Peter");
nameList.add("9_Susan");

List<String> filteredList = Stream.of(numberList.toArray(new String[0]))
                .filter(str -> nameList.stream().anyMatch(str::startsWith))
                .collect(Collectors.toList());

上面的代码运行没有错误,但是filteredList为空。显然我做错了。

filteredList仅应包含:

1_John

9_Susan

4 个答案:

答案 0 :(得分:4)

您在错误的startsWith上致电String(例如,测试是否用"1_".startsWith("1_John")而不是"1_John".startsWith("1_"))。

您应流式传输nameList并使用numberList进行过滤:

List<String> filteredList = 
    nameList.stream()
            .filter(str -> numberList.stream().anyMatch(str::startsWith))
            .collect(Collectors.toList());

P.S。 Stream.of(numberList.toArray(new String[0]))是多余的。请改用numberList.stream()

答案 1 :(得分:3)

作为Eran解决方案的替代方案,您还可以使用removeIfnoneMatch的组合,如下所示:

List<String> filteredList = new ArrayList<>(nameList);
filteredList.removeIf(str -> numberList.stream().noneMatch(str::startsWith));

答案 2 :(得分:0)

提供解决方案的另一种尝试可能是使用contains,尽管startsWithcontains的实际实现是不同的,但在OP情况下,两者都将获取 same < / strong>结果。

List<String> strList = nameList.stream().filter(s->numberList.stream().anyMatch(s::contains)).collect(Collectors.toList());

输出

  

[1_John,9_Susan]

答案 3 :(得分:0)

List<String> numberList = new ArrayList<>();
numberList.add("1_");
numberList.add("9_");

List<String> nameList = new ArrayList<>();
nameList.add("1_John");
nameList.add("2_Peter");
nameList.add("9_Susan");

以下是正确的代码:

enter image description here

您的代码使用以下内容:

enter image description here