gpt4 book ai didi

Java 8 如何从两个集合中过滤不同的实体?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:54:23 25 4
gpt4 key购买 nike

我想使用 Java 8 流过滤器集合,但我发现所有示例都是一个集合,Java 6 是:

public class User {
public Long id;
public String name;

public User(Long id, String name) {
this.id = id;
this.name = name;
}

List<User> usersA = new ArrayList<>();

usersA.add(new User(1l,"A"));
usersA.add(new User(2l,"B"));
usersA.add(new User(3l,"C"));

List<User> usersB = new ArrayList<>();
usersB.add(new User(33l,"A"));
usersB.add(new User(34l,"B"));
usersB.add(new User(35l,"D"));
usersB.add(new User(36l,"C"));

List<User> tempUser = new ArrayList<>();
tempUser.addAll(usersB);

for (User user : usersA) {
for (User user1 : tempUser) {
System.out.println(user1.getName().equalsIgnoreCase(user.getName()));
if (user1.getName().equalsIgnoreCase(user.getName())){
System.out.println("remove:"+user1.getName());
tempUser.remove(user1);
break;
}
}

}

System.out.println("last:"+tempUser);

而 Java 8 我想使用流 api 而不是使用 foreach,你能给我举个例子吗?谢谢

最佳答案

所以,如果我没理解错的话,你想创建一个包含 usersB 的所有用户的新列表, 除了那些与 usersA 中的任何用户同名的用户,对吧?

首先,我会改变策略:不是添加所有用户,然后删除一些用户,而是只添加首先属于列表的用户。

在 Java 8 中,这可以用

List<User> result = 
usersB.stream()
.filter(u -> !userNameIn(u, usersA))
.collect(Collectors.toList());

userNameIn定义为

private boolean userNameIn(User u, List<User> users) {
return users.stream().anyMatch(user -> user.getName().equalsIgnoreCase(u.getName()));
}

如果 usersA 效率会很低包含大量用户。一个更有效的解决方案是存储 usersA 的所有小写名称。在 HashSet 中,并将方法替换为

List<User> result = 
usersB.stream()
.filter(u -> !lowercaseNames.contains(u.getName().toLowerCase()))
.collect(Collectors.toList());

关于Java 8 如何从两个集合中过滤不同的实体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33645740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com