Java—删除集合中另一个集合中的对象,其任意含义为“删除”;等于;
如果我只想建立在绝对平等的基础上,这是非常容易的。我只想:Java—删除集合中另一个集合中的对象,其任意含义为“删除”;等于;,java,collections,equals,Java,Collections,Equals,如果我只想建立在绝对平等的基础上,这是非常容易的。我只想: collectionA.removeAll(collectionB). 但是,假设我有一个目标: class Item { private String color; private String name; private String type; } 还有两个系列 List<Item> items1, List<item> items2. 列出项目1,列出项目2。 …但我只想删除it
collectionA.removeAll(collectionB).
但是,假设我有一个目标:
class Item {
private String color;
private String name;
private String type;
}
还有两个系列
List<Item> items1, List<item> items2.
列出项目1,列出项目2。
…但我只想删除item1中与item2中的内容具有相同名称和类型的所有内容
注意,我不能为这个类定义equals或hashcode子类
我希望这与现有collections.removeAll方法的复杂性相同
我能想到的最佳解决方案是:
class SimpleItem {
String name;
String type;
Item item;
public SimpleItem(Item item) {
this.name = item.getName();
this.type = item.getType();
}
@Override
public boolean equals(Object obj) {
...
}
@Override
public int hashCode() {
...
}
}
Set<SimpleItem> simpleItems1 = ...;
for (Item item : items1) {
simpleItems1.add(new SimpleItem(item));
}
Set<SimpleItem> simpleItems2 = ...;
for (Item item : items2) {
simpleItems2.add(new SimpleItem(item));
}
simpleItems1.removeAll(simpleItems2);
Set<Item> items = ...;
for (SimpleItem simpleItem : simpleItems) {
items.add(simpleItem.item);
}
类SimpleItem{
字符串名;
字符串类型;
项目;
公共SimpleItem(项目){
this.name=item.getName();
this.type=item.getType();
}
@凌驾
公共布尔等于(对象obj){
...
}
@凌驾
公共int hashCode(){
...
}
}
设置simpleItems1=。。。;
用于(项目:项目1){
simpleItems1.添加(新SimpleItem(项));
}
设置simpleItems2=。。。;
用于(项目:项目2){
simpleItems2.添加(新SimpleItem(项));
}
simpleItems1.removeAll(simpleItems2);
集合项目=。。。;
for(SimpleItem SimpleItem:simpleItems){
items.add(simpleItem.item);
}
…但这太冗长了。它是Java8。我缺少了什么聪明的解决方案?您可以使用类来实现这一点。好的例子是
您提到它是Java 8。在这种情况下,您有一个非常简单和直接的方法来实现这一点:
list1.removeIf(item1 -> list2.stream().anyMatch(item2 -> customEquals(item1, item2));
如果您的customEquals
方法是Item
的成员,您可以使用方法引用使其更整洁:
list1.removeIf(item -> list2.stream().anyMatch(item::customEquals));
在您的情况下,您可以直接将条件放入语句中,而不是创建单独的方法:
list1.removeIf(item1 -> list2.stream().anyMatch(item2 ->
item1.getName().equals(item2.getName()) && item1.getType().equals(item2.getType())));
方便地
removeIf
是Collection
接口的默认成员,因此实现Collection
的任何类都应该支持它,只要实现的迭代器支持remove
您不清楚要做什么,但是如果您想从集合中筛选一些元素,您可以执行类似persons.parallelStream().filter((Person p)->{return p.getAge()>18;})代码>@keyser如果我的实现看起来正确,我想我会坚持下去。对于一个非常简单的操作来说,它看起来像是太多的文本了。@Jeremy我有点错过了需要包装它的部分。希望你能像乔希建议的那样做。