我想使用java 8根据属性customerId和customerRegistration从对象列表中分离重复项和非重复项
分离意义
如果我有3条记录具有相同的customerId和customerRegistration,则第一条记录应添加到非重复列表中,第二条记录应被添加到重复列表中。
我在下面的pojo类中创建了基于customerId和customerRegistration的hashcode和equals方法。
public class Asset {
private String customerName;
private int customerId;
private String Type;
private String customerRegistration;
private int assetTagList;
private String rso;
private String active;
private int billableUser;
private int billableAsset;
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Asset asset = (Asset) o;
return customerId == asset.customerId && Objects.equals(customerRegistration, asset.customerRegistration);
}
@Override
public int hashCode() {
return Objects.hash(customerId, customerRegistration);
}
}
我已经在java7中编写了以下逻辑,这将正常工作,有没有办法使用流编写(将以下代码中的forloop逻辑转换为流)?
public Map<String ,List<Asset>> execute1() throws IOException {
List<Asset> assetList=new ArrayList<>();
Set<Asset> set=new HashSet<>();
List<Asset> duplicateList=new ArrayList<>();
List<Asset> nonDuplicateList=new ArrayList<>();
Map<String ,List<Asset>> map = new HashMap<>();
Asset asset1 = new Asset("French Customer1", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
Asset asset2 = new Asset("French Customer2", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
Asset asset3 = new Asset("French Customer3", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset4= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset5= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset6 = new Asset("French Customer5", 674, "Vehicle", "KNH 9008", 175, "FR", "Yes", 0, 0);
assetList.add(asset1);
assetList.add(asset2);
assetList.add(asset3);
assetList.add(asset4);
assetList.add(asset5);
assetList.add(asset6);
for (Asset assetTemp:assetList){
if(set.add(assetTemp)){
nonDuplicateList.add(assetTemp);
}
else {
duplicateList.add(assetTemp);
}
}
map.put("duplicate",duplicateList);
map.put("nonDuplicateList",nonDuplicateList);
return map
}
预期输出如下(来自上述execute1函数中定义的输入资产列表)
非重复列表应具有(资产1,资产3,资产6):
Asset asset1 = new Asset("French Customer1", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
Asset asset3 = new Asset("French Customer3", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset6 = new Asset("French Customer5", 674, "Vehicle", "KNH 9008", 175, "FR", "Yes", 0, 0);
CopicateList应该有:(asset2, asset4, asset5)
Asset asset2 = new Asset("French Customer2", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
Asset asset4= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset5= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
您可以使用相同的方法使用<code>集
java prettyprint-override">assetList.stream().collect(Collectors.partitioningBy(set::add));
这将返回一个带有< code>Boolean键的映射,其中< code>true是非重复的。
您可以根据添加到集合中返回true或false对元素进行分组:
public static Map<String ,List<Asset>> execute2() throws IOException {
List<Asset> assetList=new ArrayList<>();
Asset asset1 = new Asset("French Customer1", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
Asset asset2 = new Asset("French Customer2", 673, "Vehicle", "KNH 9009", 175, "FR", "Yes", 0, 0);
Asset asset3 = new Asset("French Customer3", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset4= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset5= new Asset("French Customer4", 673, "Vehicle", null, 175, "FR", "Yes", 0, 0);
Asset asset6 = new Asset("French Customer5", 674, "Vehicle", "KNH 9008", 175, "FR", "Yes", 0, 0);
assetList.add(asset1);
assetList.add(asset2);
assetList.add(asset3);
assetList.add(asset4);
assetList.add(asset5);
assetList.add(asset6);
Set<Asset> set=new HashSet<>();
return assetList.stream().collect(Collectors.groupingBy(x -> set.add(x) ? "nonDuplicateList" : "duplicate"));
}
问题内容: 试图从基于某些属性的对象列表中删除重复项。 我们可以使用Java 8以简单的方式做到吗 我们可以根据员工的财产从中删除重复项吗?我看到过从字符串arraylist中删除重复字符串的帖子。 问题答案: 你可以从获取流并将其放入其中,从中提供一个唯一比较ID的自定义比较器。 然后,如果你确实需要一个列表,则可以将该集合放回到ArrayList中。 给出示例: 它将输出: 另一个想法可能是使
我有一份包含订单项目列表的订单 如果在这个列表中我有以下项目 我想计算订单所有者名称相同的值之和。 e、 g.如果所有者名称为“John”,则返回417.00,如果名称为“Doe”,则返回19.00。 我怎么能通过小溪Java呢?非常感谢
我正试图从基于某些属性的对象列表中删除重复项。 我们能用一种简单的方法使用Java8吗 我们是否可以根据员工的属性删除其中的重复项。我看到过从String的arraylist中删除重复字符串的帖子。
假设我有一个名为House的对象,它包含一个列表 对于房间,只有一个属性,其值由int表示: 现在,使用Java8,并给出一个带有
我有一个这样定义的类: 现在我有一个项目对象列表,现在我想找到所有项目的总价。在Java8中我们如何做到这一点? 如果列表是简单的整数,那么我们在这里给出了解决方案--如何用java流求和整数列表?
问题内容: 这个问题已经在这里有了答案 : 调用非对象上的成员函数[重复] (8个答案) 6年前关闭。 在控制页面上: 在查看页面上: 错误是: 注意:尝试在第22行的C:\ wamp \ www \ phone \ pages \ init.php中获取非对象的属性 你能修好它吗?我不知道发生了什么。 问题答案: 检查手册。它返回一个对象,而不是对象数组。 我猜你想要这样的东西 可能我建议您看看