繁体   English   中英

我应该如何获得2个清单之间的区别<Object>

[英]How should I get the difference between 2 list<Object>

有2个具有不同大小和对象的实体列表,例如List<BrandEntity> baseEntityListList<BrandEntity> subEntityList ,现在我想获取存储在baseEntityList中而不是subEntityList中的结果,不同的维度是brandName。 我已经覆盖了equals方法,但是它不起作用。 这是我的代码。

Main.class: 
  findDifferenceList(baseEntityList, subEntityList)
Method:

private <T> List<T> findDifferenceList(List<T> baseBrandList, List<T> subBrandList) {
return baseBrandList.stream().filter(item -> !subBrandList.contains(item)).collect(toList());

}

BrandEntity:

@Slf4j
public class BrandEntity {
  @JsonSetter("shopid")
  Long shopId;


  @JsonSetter("brand")
  String brandName;

  @JsonIgnore Long principalId;

  // getter and setter

  @Override
  public boolean equals(Object o) {
    if (this == o) return true;
    if (o == null || getClass() != o.getClass()) return false;
    BrandEntity that = (BrandEntity) o;
    return Objects.equals(brandName, that.brandName);
  }

  @Override
  public int hashCode() {
    return Objects.hash(brandName);
  }
}

这是一些棘手的代码,如果我想这样做,我会删除所有subEntityListbaseEntityList
或者如果您想在两个列表中找到差异,可以对两个列表都进行

var diffWithBase = subEntityList.removeAll(baseEntityList);
var diffWithSubList = baseEntityList.removeAll(subEntityList);
// print 

您可以尝试使用老式Java方法

List<BrandEntity> diff = new ArrayList<>(baseEntityList);
difference.removeAll(subEntityList);
return diff;
List<BrandEntity> findDifferenceList(List<BrandEntity> list1, List<BrandEntity> list2) {
 return list1.stream().filter(i -> !list2.contains(i))
            .concat(list2.stream.filter(i -> !list1.contains(i))
            .collect(Collectors.toList());
}

您需要按照两个方向进行操作;)。 A和B中没有什么,B和A中没有什么。

好了,您正在做的是根据字符串的引用相等性比较字符串-如下面的Objects中所示。 但是您需要在它们的值相等brandName.equals(that.brandName)例如brandName.equals(that.brandName)上进行比较。

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}

尽管如此,我还是希望使用现有的库来比较List,例如Apache的共同点CollectionUtils

CollectionUtils.removeAll(List<T> baseBrandList, List<T> subBrandList);

列表,列表之间的区别<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之间有什么区别?</strong></p><h1> 1.清单</h1><p> List :是原始类型,因此不是typesafe的。 它只会在转换错误时产生运行时错误。 当转换错误时,我们希望出现编译时错误。 不推荐使用。</p><h1> 2.列表<?></h1><p> List<?>是一个无限通配符。 但我不确定它的用途是什么? 我可以毫无问题地打印一个List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>为什么我不能将项目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白这种语法。 我看到了这样的东西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有时,我会看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它们都是一样的还是代表不同的东西?</strong></p><h1> 4. 列表<对象></h1><p> 这给出了错误“方法test(List<Object>)不适用于参数List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我尝试这个然后我得到“无法从List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子类,那么为什么List<String>不是 List List<Object>的子类?</strong></p></div></object></e></t>

[英]Difference between List, List<?>, List<T>, List<E>, and List<Object>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 列表之间的区别<Object>并列出 List和有什么不一样 <Object[]> 和清单 <Object> ? 我应该如何解释接口和抽象类之间的区别? List和List之间的Java差异<Object> List <Object>和List <?>之间有什么区别 列表,列表之间的区别<!--?--> , 列表<t> , 列表<e> , 和列表<object><div id="text_translate"><p> <strong>List 、 List<?> 、 List<T> 、 List<E>和List<Object>之间有什么区别?</strong></p><h1> 1.清单</h1><p> List :是原始类型,因此不是typesafe的。 它只会在转换错误时产生运行时错误。 当转换错误时,我们希望出现编译时错误。 不推荐使用。</p><h1> 2.列表<?></h1><p> List<?>是一个无限通配符。 但我不确定它的用途是什么? 我可以毫无问题地打印一个List<?> :</p><pre> public static void test(List<?> list){ System.out.println(list); // Works }</pre><p> <strong>为什么我不能将项目添加到List<?> ?</strong></p><pre> public static void test(List<?> list){ list.add(new Long(2)); // Error list.add("2"); // Error System.out.println(list); }</pre><h1> 3.列表<T></h1><pre> public static void test(List<T> list){ // T cannot be resolved System.out.println(list); }</pre><p> 我不明白这种语法。 我看到了这样的东西,它有效:</p><pre> public <T> T[] toArray(T[] a){ return a; }</pre><p> <strong>有时,我会看到<T>或<E>或<U> 、 <T,E> 。</strong> <strong>它们都是一样的还是代表不同的东西?</strong></p><h1> 4. 列表<对象></h1><p> 这给出了错误“方法test(List<Object>)不适用于参数List<String> ”:</p><pre> public static void test(List<Object> list){ System.out.println(list); }</pre><p> 如果我尝试这个然后我得到“无法从List<String>投射到List<Object> ”:</p><pre> test((List<Object>) names);</pre><p> 我很迷惑。 <strong>String是Object的子类,那么为什么List<String>不是 List List<Object>的子类?</strong></p></div></object></e></t> 如果 list 是 arraylist,Double.parseDouble(list.get(i).toString()) 和 list.get(i) 之间是否有区别<double></double> 如何使用毫秒获得android中两个日期之间的差异? 在 Java 中,如何获得两个日期之间的秒数差异? 将两个DateTimes区分为DateTime对象?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM