我想从不同的来源在一个列表数据库连接。某些来源可能/可能不提供url。
我想保留的记录有完整的信息(即dbname,connurl,isactive)+如果任何数据库没有与任何来源的完整记录。
record.java文件,
String dbName;
String connUrl;
String isActiveYN;
主应用程序.java,
List <Record> connRecords = new ArrayList<>();
connRecords = someFunc(sourceName) // some func takes source as param and returns connection List
connRecords.addAll(someFunc(sourceName));
connRecords.addAll(someFunc(sourceName));
//logic for getting all unique DBs
例如:源alpha的列表1:[{a,y},{b,y},{c,y},{d,y}]
源代码beta的列表2:[{a, url,y},{b,xyzurl,y}]
源gamma的列表3:[{a,y},{c,y}]
合并所有列表后,我们得到:
i/p列表:[{a,y},{b,y},{c,y},{d,y},{a, url,y},{b,xyz url,y},{a,y},{c,y}]
对于dbnamea,sourcebeta有完整的记录信息,所以我们将使用它
对于dbnameb,sourcebeta有完整的记录信息,所以我们将使用它
对于dbnamec,即使没有一个源代码有完整的信息,我们仍然会保留它,因为它是一个可用的db,并且某些源代码可能在将来的某个时候有url连接。对于dbname d,即使没有一个源代码有完整的信息,我们仍然会保留它,因为它是一个可用的db,并且某些源代码可能在将来的某个时候有url连接。
所需的o/p列表:[{a, url,y},{b,xyz url,y},{c,y},{d,y}]
有人能推荐Java8方法(使用流)吗?
老派的做法:
Map<String, Record> map = new HashMap<>();
for (Record record: recordList) {
String dbName = record.getDBName();
String isActiveYN = record.getIsActiveYN();
if (map.containsKey(dbName)) {
if(record.getConnURL() != null)
map.replace(dbName, record);
} else {
map.put(dbName, record);
}
}
List<Record> merged = new ArrayList<>(map.values());
1条答案
按热度按时间m1m5dgzv1#
它可以通过实现几个
merge
功能:合并两个
Record
示例合一合并两个
String
示例合一覆盖
toString
提供所需输出的方法固定设置
isActiveN
:如果需要合并,则设置为Y
```// using Lombok annotations for brevity
@Data
@AllArgsConstructor
@EqualsAndHashCode
class Record {
String dbName;
String connUrl;
String isActiveYN;
}
// Source Alpha
List connRecords = new ArrayList<>(Arrays.asList(
new Record("A", null, "N"),
new Record("B", null, "Y"),
new Record("C", null, null),
new Record("D", null, "N")
));
// Source Beta
connRecords.addAll(Arrays.asList(
new Record("A", "abc-url", null),
new Record("B", "xyz-url", "N")
));
// Source Gamma
connRecords.addAll(Arrays.asList(
new Record("A", null, "N"),
new Record("C", null, "N")
));
List merged = new ArrayList<>(
connRecords.stream()
.collect(Collectors.toMap(Record::getDbName, rec -> rec, Record::merge))
.values()
);
System.out.println(merged);
[{A, abc-url, Y}, {B, xyz-url, Y}, {C, Y}, {D, N}]