如何使用来自迭代器和for循环的流/过滤器/ lambdas?

时间:2019-04-02 19:55:26

标签: java java-stream

由于我习惯于编写较旧的Java代码,因此我对流,过滤器和lambda不太熟悉。我想尝试在Java的较新版本中使用新功能。如果没有编译问题,我似乎无法开始任何事情。感谢您的任何帮助,谢谢。

List<Obj> a = getListForA();    // ['werdsegs', 'wsghnmrst', 'vaasdfdas', 'iujhgfds']
List<Obj> b = getListForB();    // ['aalaksdjf', 'erftghjuk', 'werdsejfksd', 'asdklgjaklgj', 'poijgndf']

a.forEach((item) -> {
    String foo = item.substring(0,5);
    for(Iterator<Obj> i = b.iterator(); i.hasNext();) {
        Obj o = i.next();
        if(foo.equals(o.substring(0,5)) {
            i.remove();
        }
    }
});

我希望包含子字符串的任何项目从列表b中删除。

代码运行后,列表b应该显示下面的列表,其中缺少werdsejfksd ['aalaksdjf', 'erftghjuk', 'asdklgjaklgj', 'poijgndf']

2 个答案:

答案 0 :(得分:2)

如果您将Obj替换为String,并修复了编译错误,则您的代码可以正常运行:

List<String> a = Arrays.asList("werdsegs", "wsghnmrst", "vaasdfdas", "iujhgfds");
List<String> b = new ArrayList<>(Arrays.asList("aalaksdjf", "erftghjuk", "werdsejfksd", "asdklgjaklgj", "poijgndf"));

a.forEach((item) -> {
    String foo = item.substring(0,5);
    for (Iterator<String> i = b.iterator(); i.hasNext(); ) {
        String o = i.next();
        if (foo.equals(o.substring(0,5))) {
            i.remove();
        }
    }
});

System.out.println(b); // prints: [aalaksdjf, erftghjuk, asdklgjaklgj, poijgndf]

正如jonathan Heindl在another answer中所建议的那样,您可以使用removeIf(...)来简化代码。不过,为了获得更好的性能,我会先构建一个Set

List<String> a = Arrays.asList("werdsegs", "wsghnmrst", "vaasdfdas", "iujhgfds");
List<String> b = new ArrayList<>(Arrays.asList("aalaksdjf", "erftghjuk", "werdsejfksd", "asdklgjaklgj", "poijgndf"));

Set<String> set = a.stream().map(s -> s.substring(0,5)).collect(Collectors.toSet());
b.removeIf(s -> set.contains(s.substring(0,5)));

System.out.println(b); // prints: [aalaksdjf, erftghjuk, asdklgjaklgj, poijgndf]

如果您想要一个新列表,则可以使用b的{​​{1}}方法来代替修改filter(...)

Stream

答案 1 :(得分:-1)

我猜是这样

List<String> a = getListForA();    // ['werdsegs', 'wsghnmrst', 'vaasdfdas', 'iujhgfds']
List<String> b = getListForB();    // ['aalaksdjf', 'erftghjuk', 'werdsejfksd', 'asdklgjaklgj', 'poijgndf']

b.removeIf(bObj->a.stream().anyMatch(aObj->aObj.substring(0,5).equals(bObj.substring(0,5))));