【发布时间】:2021-06-17 07:02:26
【问题描述】:
给定 2 个包含 2 种不同对象的列表(就像您从 API 获取一个集合以创建客户端或更新(如果存在)):
public static void main(String[] args) {
List<ClientA> clientsA = new ArrayList<>();
List<ClientB> clientsB = new ArrayList<>();
for (int i = 1; i <=5; i++) {
clientsA.add(new ClientA("JohnA-" + i, "DoeA-" + i, "A-" + i));
clientsB.add(new ClientB("JohnB-" + i, "DoeB-" + i, "B-" + i));
}
}
@Getter
@Setter
@AllArgsConstructor
static class ClientA {
private String firstName;
private String lastName;
private String ssNumber;
}
@Getter
@Setter
@AllArgsConstructor
static class ClientB {
private String firstName;
private String lastName;
private String security;
}
目的是建立一个新的ClientA对象列表:
- 如果
clientsA列表中有一个条目,其ssNumber值等于ClientB列表中客户端的security值,则更新找到的条目firstName和lastName属性; - 否则,从
clientsB列表中创建一个具有相同属性/值的新ClientA对象,分配firstName->firstName,lastName->lastName,securityNumber-> @ 987654336@.
我打算使用contains 或retainAll 方法,但它需要覆盖上述类的equals 和hashCode,这是我做不到的。
我希望有这样的东西:
public void process() {
List<ClientA> clientsA = new ArrayList<>();
List<ClientB> clientsB = new ArrayList<>();
for (int i = 1; i <=5; i++) {
clientsA.add(new ClientA("John-" + i, "Doe-" + i, "A-" + i));
clientsB.add(new ClientB("JohnB-" + i, "DoeB-" + i, "B-" + i));
}
clientsA.add(new ClientA("Samantha", "Smith", "123456789"));
clientsB.add(new ClientB("Michael", "Smith", "123456789"));
findExistingEClientsA(clientsA, clientsB);
findNewClientsB(clientsA, clientsB);
}
private void findNewClientsB(List<ClientA> clientsA, List<ClientB> clientsB) {
Set resultSet = new HashSet();
for (ClientA clientA : clientsA) {
List<ClientB> collect = clientsB.stream().filter(c -> !c.getSecurity().equals(clientA.getSsNumber())).collect(Collectors.toList());
resultSet.addAll(collect);
}
System.out.println("+++++++ New clients B +++++++");
System.out.println(resultSet);
}
private void findExistingEClientsA(List<ClientA> clientsA, List<ClientB> clientsB) {
Set resultSet = new HashSet();
for (ClientA clientA : clientsA) {
List<ClientB> collect = clientsB.stream().filter(c -> c.getSecurity().equals(clientA.getSsNumber())).collect(Collectors.toList());
resultSet.addAll(collect);
}
System.out.println("++++++ existing clients B +++++++ ");
System.out.println(resultSet);
}
返回以下结果的内容:
++++++ existing clients B +++++++
[ClientB{firstName='Michael', lastName='Smith', security='123456789'}]
+++++++ New clients B +++++++
[ClientB{firstName='JohnB-4', lastName='DoeB-4', security='B-4'}, ClientB{firstName='JohnB-2', lastName='DoeB-2', security='B-2'}, ClientB{firstName='JohnB-5', lastName='DoeB-5', security='B-5'}, ClientB{firstName='JohnB-3', lastName='DoeB-3', security='B-3'}, ClientB{firstName='JohnB-1', lastName='DoeB-1', security='B-1'}, ClientB{firstName='Michael', lastName='Smith', security='123456789'}]
这是一个好的解决方案还是有更好的解决方案?
但还是没有成功。
【问题讨论】:
-
为什么不自己循环浏览集合?
-
刚刚更新了帖子:)。
标签: java collections java-stream