Как разделить Java List
, чтобы получить следующие два типа списка:
- Список, содержащий элементы, удовлетворяющие определенному условию
- Список, содержащий все элементы, но они будут пересекаться друг с другом
Мой текущий рабочий подход использует forEach
, как показано ниже:
Map<String, Set<Attribute>> applicableAttributeMap = new HashMap<>();
Set<Attribute> unionMandatoryAttributes = new HashSet<>();
Set<Attribute> intersectedAttributes = new HashSet<>();
givenNames.forEach(givenName -> {
List<Attribute> applicableAttributes = getAllApplicableAttributes(givenName); //function to retrieve List<Attribute> by passing givenName
if (applicableAttributes != null && !applicableAttributes.isEmpty()) {
unionMandatoryAttributes.addAll(
applicableAttributes
.stream()
.filter(Attribute::getIsRequired)
.collect(Collectors.toSet())
);
if (intersectedAttributes.isEmpty()) {
intersectedAttributes.addAll(applicableAttributes);
}
intersectedAttributes.retainAll(applicableAttributes);
}
});
applicableAttributeMap.put(UnionMandatory, unionMandatoryAttributes);
applicableAttributeMap.put(IntersectedAll, intersectedAttributes);
Я пытаюсь упростить приведенный выше блок кода с помощью partitioningBy
, но не могу получить желаемый результат. Я не могу собрать другой список, в котором есть все элементы вместе с Map
s key
как String
.
Вот мой partitioningBy
подход :
Map<Boolean, Set<Attribute>> applicableMap = givenNames
.stream()
.flatMap(s -> getAllApplicableAttributes(s).stream())
.filter(Objects::nonNull)
.collect(Collectors.partitioningBy(
Attribute::getIsRequired,
Collectors.mapping(Function.identity(),Collectors.toSet())
));
Как я могу создать Map<String , Set<Attributes>>
, который будет удовлетворять условию, данному в рабочем подходе или любом другом упрощенном решении?
(Примечание: моя цель - добиться точного, что происходит при рабочем подходе Возможно, я что-то упустил при объяснении проблемы. Но суть в том, чтобы получить такой же результат, как и рабочий подход , используя что-то вроде partitioningBy
или любой другой подход лучше, чем то, что я сделал.)