有没有更好的方法 - 这样的boilderplate代码。 我使用Java 8,我会用流做 - 但我需要一些帮助。我已经尝试过了... removeIf()但它没有用。
final List<CalendarEventUserConnection> calendarEventUserConnectionsToDelete = new ArrayList<>();
for (final CalendarEventUserConnection existingCalendarEventUserConnection : existingCalendarEventUserConnections) {
boolean contains = false;
for (final CalendarEventUserConnection newCalendarEventUserConnection : calendarEventUserConnections) {
if (newCalendarEventUserConnection.getId() != null
&& newCalendarEventUserConnection.getId().equals(existingCalendarEventUserConnection.getId())) {
contains = true;
}
}
if (contains == false) {
calendarEventUserConnectionsToDelete.add(existingCalendarEventUserConnection);
}
}
答案 0 :(得分:1)
您可以将其简化。看起来您正在过滤列表以查看其他列表中的任何内容是否与其匹配,并将结果收集到另一个列表中。
因此,您可以使用filter
,anyMatch
和collect
。
final List<CalendarEventUserConnection> toDelete = existingCalendarEventUserConnections.stream()
.filter(c -> !calendarEventUserConnections.stream()
.map(CalendarEventUserConnection::getId)
.anyMatch(id -> id!=null && id.equals(c.getId())))
.collect(Collectors.toList());
答案 1 :(得分:0)
如果要获取listA上的所有对象而不是listB
public static <T> List<T> aNotB(List<T> listA, List<T> listB) {
List<T> result = new ArrayList(listA);
result.removeAll(listB);
return result;
}
仅当equals
T
方法正确实施时才有效...
答案 2 :(得分:0)
您自己的搜索是O(NxM),其中N是一个列表中的元素数,M是另一个列表中的元素。
我建议将calendarEventUserConnections
中的所有ID收集到一个集合中。
然后,您可以将existingCalendarEventUserConnections
中ID在该集合中的所有元素收集到您的删除列表中。
假设您的ID是字符串,则类似于:
Set<String> idsToDelete = calendarEventUserConnections.stream()
.map( CalendarEventUserConnection::getId )
.filter( Objects::nonNull )
.collect(Collectors.toCollection(HashSet::new));
List<CalendarEventUserConnection> connectionsToDelete =
existingCalendarEventUserConnections.stream()
.filter( idsToDelete::contains )
.collect(Collectors.toList());
(未经测试的代码)
考虑到您使用HashSet
,这会降低O(M + N)而不是O(MxN)的复杂性