由于我习惯于编写较旧的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']
答案 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))));