use*_*390 3 java guava java-8 java-stream
我想使用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);
Run Code Online (Sandbox Code Playgroud)
而Java 8我想使用stream api而不是使用foreach,你可以为我举个例子吗?谢谢
所以,如果我理解正确,你想要创建一个包含所有用户的新列表usersB,除了那些与其中任何用户同名的用户usersA,对吧?
首先,我会改变策略:不是添加所有用户,而是删除一些用户,我只会添加属于列表的用户.
在Java 8中,可以完成
List<User> result =
usersB.stream()
.filter(u -> !userNameIn(u, usersA))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
与userNameIn定义为
private boolean userNameIn(User u, List<User> users) {
return users.stream().anyMatch(user -> user.getName().equalsIgnoreCase(u.getName()));
}
Run Code Online (Sandbox Code Playgroud)
如果usersA包含大量用户,那将不会非常有效.更有效的解决方案是将所有小写名称存储usersA在HashSet中,并将方法替换为
List<User> result =
usersB.stream()
.filter(u -> !lowercaseNames.contains(u.getName().toLowerCase()))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
544 次 |
| 最近记录: |