Java在列表b

时间:2017-02-28 14:46:46

标签: java list

有没有更好的方法 - 这样的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);
        }
    }

3 个答案:

答案 0 :(得分:1)

您可以将其简化。看起来您正在过滤列表以查看其他列表中的任何内容是否与其匹配,并将结果收集到另一个列表中。

因此,您可以使用filteranyMatchcollect

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)的复杂性