Java 如何将第三个列表仅传递给公共对象?
我需要将两个列表之间的普通用户传递到第三个列表Java 如何将第三个列表仅传递给公共对象?,java,list,Java,List,我需要将两个列表之间的普通用户传递到第三个列表 List<User> listByCity = new ArrayList<User>(); List<User> listByService = new ArrayList<User>(); //initializing listByCity and listByService happens here . . . List<User> newList = new ArrayList&l
List<User> listByCity = new ArrayList<User>();
List<User> listByService = new ArrayList<User>();
//initializing listByCity and listByService happens here
.
.
.
List<User> newList = new ArrayList<User>();
newList.addAll(listByCity);
newList.addAll(listByService);
List listByCity=new ArrayList();
List listByService=new ArrayList();
//初始化listByCity和listByService发生在这里
.
.
.
List newList=newarraylist();
newList.addAll(listByCity);
newList.addAll(listByService);
所以我有一个城市的用户列表和另一个提供服务的用户列表,我只需要普通用户,我可以怎么做?我刚刚使用“addAll”添加了两个列表,但它无法按我所希望的方式工作。您可以使用
retainal()
保持两个列表的相交:
List<User> newList = new ArrayList<User>();
newList.addAll(listByCity);
newList.retainAll(listByService);
List newList=newarraylist();
newList.addAll(listByCity);
newList.retainal(listByService);
只有当
User
正确地实现equals()
时(或者如果对象实际上是相同的引用),这才有效。使用retainal
List<User> newList = new ArrayList<User>(listByCity);
newList.retainAll(listByService);
对于小列表,我建议使用另一个答案所建议的
List.retainal()
如果列表很大,您可以从将要保留的列表中创建一个哈希集
,并显式迭代,从而获得更好的性能:
List<User> newList = new ArrayList<User>();
Set<User> testSet = new HashSet<>(listByService);
for (User user: listByCity) {
if (testSet.contains(user)) {
newList.add(user);
}
}
List newList=newarraylist();
Set testSet=newhashset(listByService);
for(用户:listByCity){
if(testSet.contains(用户)){
添加(用户);
}
}
您可以通过组合两个列表并将它们过滤到第三个列表中来使用流API:
List<User> listByCity = Arrays.asList( new User("c1", "s1"), new User("c2", "s2"), new User("c1", "s3") );
List<User> listByService = Arrays.asList( new User("c2", "s3"), new User("c1", "s2"), new User("c1", "s3") );
List<User> newList = Stream.concat( listByCity.stream(), listByService.stream() )
.sequential()
.filter( u -> u.getCity().equals("c1") && u.getService().equals("s3") )
.collect( Collectors.toList() );
List listByCity=Arrays.asList(新用户(“c1”、“s1”)、新用户(“c2”、“s2”)、新用户(“c1”、“s3”);
listByService=Arrays.asList(新用户(“c2”、“s3”)、新用户(“c1”、“s2”)、新用户(“c1”、“s3”);
List newList=Stream.concat(listByCity.Stream(),listByService.Stream())
.filter(u->u.getCity().equals(“c1”)和&u.getService().equals(“s3”))
.collect(Collectors.toList());
没有,我没有。我刚刚让用户使用sql,并在“newList”中添加了这两个列表。您所建议的方法不起作用,原因是?@YgorFraga如果您希望能够根据用户的属性(例如id、名称)比较用户,则需要覆盖equals()
。否则,将使用引用相等。我已编辑了我的答案以添加相等方法,您可以将其添加到用户类中。如果您想使用对象标识作为相等测试,则不必重写equals
即可使用retainal
。我做了一些细微的更改,代码可以正常工作expected@YgorFraga-很高兴听到。你必须做什么改变?用这种方式使用“HashSet”对我不起作用,这很奇怪。我使用了一个普通的用户列表。@YgorFraga-实际上,这有点令人震惊。它以什么方式不起作用?
List<User> listByCity = Arrays.asList( new User("c1", "s1"), new User("c2", "s2"), new User("c1", "s3") );
List<User> listByService = Arrays.asList( new User("c2", "s3"), new User("c1", "s2"), new User("c1", "s3") );
List<User> newList = Stream.concat( listByCity.stream(), listByService.stream() )
.sequential()
.filter( u -> u.getCity().equals("c1") && u.getService().equals("s3") )
.collect( Collectors.toList() );