List<Attribute> (@NotNull Element origin, @NotNull JDOMInterner interner) { List<Attribute> originAttributes = JDOMUtil.getAttributes(origin); if (originAttributes.isEmpty()) { return EMPTY_LIST; } AttributeType type = null; String[] nameValues = new String[originAttributes.size() * 2]; Namespace namespace = null; for (int i = 0; i < originAttributes.size(); i++) { Attribute origAttribute = originAttributes.get(i); if (type == null) { type = origAttribute.getAttributeType(); namespace = origAttribute.getNamespace(); } else if (type != origAttribute.getAttributeType() || !origAttribute.getNamespace().equals(namespace)) { type = null; // no single type/namespace, fallback to ImmutableAttrList break; } String name = interner.internString(origAttribute.getName()); String value = interner.internString(origAttribute.getValue()); nameValues[i * 2] = name; nameValues[i * 2 + 1] = value; } if (type == null) { //noinspection SSBasedInspection return Collections.unmodifiableList(originAttributes.stream().map(attribute -> { return new ImmutableAttribute(interner.internString(attribute.getName()), interner.internString(attribute.getValue()), attribute.getAttributeType(), attribute.getNamespace()); }).collect(Collectors.toList())); } else { return new ImmutableSameTypeAttributeList(nameValues, type, namespace); } }