可以使用java8的stream api来比较两个list的差异,并取出不同的对象。
方式一具体步骤如下:
将两个list转换为stream类型;
调用stream的filter方法,将不同的对象过滤出来;
将过滤出的不同的对象转换为list类型。
list list1 = arrays.aslist(a, b, c, d);list list2 = arrays.aslist(b, c, e, f, a, d);list diff = list1.stream().filter(item -> !list2.contains(item)).collect(collectors.tolist());list diff1 = list2.stream().filter(item -> !list1.contains(item)).collect(collectors.tolist());diff.addall(diff1);diff.foreach(x -> system.out.println(x));
上述代码中,将两个list类型的对象list1和list2转换为stream类型,并调用filter方法筛选出不同的对象。最后通过collect方法将不同的对象转换为list类型,并输出结果。
方式二具体步骤如下:
list list1 = arrays.aslist(apple, banana, orange, pear);list list2 = arrays.aslist(apple, banana, grape); list list3 = stream.concat( list1.stream().filter(str -> !list2.contains(str)), list2.stream().filter(str -> !list1.contains(str))) .collect(collectors.tolist()); system.out.println(different strings: + list3);
上述代码,首先定义了两个list类型的变量list1和list2,分别表示要比较的两个列表。然后使用stream的concat()方法将两个stream对象连接起来,得到一个由两个列表的不同元素组成的stream。
具体来说,第一个stream对象是list1中与list2不同的元素,使用filter()方法过滤出来;第二个stream对象是list2中与list1不同的元素,同样也是使用filter()方法过滤出来。最后使用collect(collectors.tolist())将这些不同的元素收集到一个list中,返回的就是两个列表不同的元素组成的集合list3。
最后在控制台输出集合list3,即可得到list1和list2中不同的字符串。
方式三具体步骤如下:
list l1 = new arraylist();l1.add(new object(1, a));l1.add(new object(2, b));l1.add(new object(3, c)); list l2 = new arraylist();l2.add(new object(1, a));l2.add(new object(3, c));l2.add(new object(4, d)); list resultlist = stream.concat(l1.stream(), l2.stream()) .collect(collectors.groupingby(function.identity(), collectors.counting())) .entryset().stream() .filter(e -> e.getvalue() == 1) .map(map.entry::getkey) .collect(collectors.tolist());
首先将两个list通过stream.concat方法合并成一个新的stream对象,并使用collectors.groupingby方法来按照对象值进行分组计数。然后通过过滤出现次数为1的对象,即为两个list中不同的对象。最后用collectors.tolist方法将所有不同的对象放到一个新的list中。
需要注意的是,object类需要正确实现equals和hashcode方法,以便stream能够正确进行对象的比较。同时,此方法适用于list中存放的对象是java内置类型或者自定义类型,但不适用于包含数组、map等集合类型的情况。
方式四具体步骤如下:
根据对象的属性进行比较两个拥有相同对象list的集合,并取出不同对象。
list l1 = arrays.aslist( new productattributenamedto(1l, 颜色), new productattributenamedto(2l, 尺码), new productattributenamedto(3l, 重量));list l2 = arrays.aslist( new productattributenamedto(1l, 颜色), new productattributenamedto(3l, 重量), new productattributenamedto(4l, 材质)); list resultlist = stream.concat(l1.stream(), l2.stream()) .collect(collectors.groupingby(productattributenamedto::getname, collectors.counting())) .entryset().stream() .filter(e -> e.getvalue() == 1) .map(e -> e.getkey()) .map(name -> stream.concat(l1.stream(), l2.stream()).filter(p -> p.getname().equals(name)).findfirst().get()) .collect(collectors.tolist());
首先将两个list通过stream.concat方法合并成一个新的stream对象,并使用collectors.groupingby方法来按照属性名称进行分组计数。然后通过过滤出现次数为1的属性名称,即为两个list中不同的属性名称。最后使用stream.map方法获取对应名称的第一个productattributenamedto对象,放到一个新的list中。
需要注意的是,productattributenamedto类需要正确实现equals和hashcode方法,以便stream能够正确进行对象的比较。同时,此方法适用于list中存放的是productattributenamedto类型的对象。如果存放其他类型的对象,则需要根据对象的属性进行比较或自定义comparator进行比较。
单节锂电池供电内置动态同步升压5W单声道音频功放IC
图像在时域内受大气湍流影响的克服方法
如何使用top/ps_mem命令查看进程内存占用
物联网开关电路PCB板制作方法
我们该如何正确选择合适的电话机器人
怎么使用Java8的Stream API比较两个List的差异呢?
马云爸爸的新玩具_ai音箱天猫精灵x1拆解图
国产首艘航母下水?中国研究中途岛海战提前预备中美“航母大战”?
adc0832是什么_adc0832和adc0809区别
UHF超高频RFID标签—优势互补释放更大可能性
vivox20发布会进入倒计时!更多爆料看这里,蓝厂全面屏很期待!
基于OV7620和ARM开发的图像采集系统
集成运放的实质 集成运放的结构
IPv6发展的三大趋势
集成数字电位器X9241的性能特点、优势及应用
linux技术:什么是标准输入输出文件
怎样在Premiere Pro中合并音频和视频剪辑
工业机器人是智能工厂不可或缺的一环
2022年前三季度软件业务收入
常见的手机天线测试方法