Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java—删除集合中另一个集合中的对象,其任意含义为“删除”;等于;_Java_Collections_Equals - Fatal编程技术网

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我有点错过了需要包装它的部分。希望你能像乔希建议的那样做。