Я думаю, что второй лучше. Arrays.asList("X","Y","Z")
извлекают ArrayList
, т. е. массив. Это нехорошо заменить значения в нем.
В общем случае, если вы хотите изменить colletion (например, заменить *
на X
, Y
и Z
), do создайте новую коллекцию в некотором роде.
Посмотрите на LinkedList
, если вы хотите сами изменить коллекцию.
Использование потоков:
public static List<String> replace(Collection<String> attributes, String value, Collection<String> additionalValues) {
return attributes.stream()
.map(val -> value.equals(val) ? additionalValues.stream() : Stream.of(val))
.flatMap(Function.identity())
.collect(Collectors.toList());
}
Не использовать потоки
public static List<String> replace(Collection<String> attributes, String value, Collection<String> additionalValues) {
List<String> res = new LinkedList<>();
for (String attribute : attributes) {
if (value.equals(attribute))
res.addAll(additionalValues);
else
res.add(attribute);
}
return res;
}
Демонстрация:
List<String> attributes = Arrays.asList("A", "B", "*", "C");
List<String> res = replace(attributes, "*", Arrays.asList("X", "Y", "Z")); // ["A", "B", "X", "Y", "Z", "C"]
Если намерение состоит в том, чтобы иметь (один) тип Event
со свойством EventValue
, которое может содержать или целое число или двойное значение, тогда [113 ] с соответствующими значениями будет служить этой цели:
enum EventValue {
case ival(Int)
case dval(Double)
}
struct Event {
let time: Date
let value: EventValue
}
let event1 = Event(time: Date(), value: .dval(40.3467))
let event2 = Event(time: Date(), value: .ival(1234))
Добавьте универсальный параметр в свою структуру Event
, а затем используйте этот тип для параметра EventValue
struct Event<T> {
let time: Date
var value: EventValue<T>?
}
, а затем просто инициализируйте EventValue
без указания типа, поскольку компилятор позволяет передавать только значение, соответствующее ограничению общего параметра. А поскольку ваш параметр не имеет ограничений, он равен Any
, поэтому вы можете передать любой тип
let event = Event(time: Date.init(), value: EventValue(value: 40.3467))
Поскольку EventValue
является универсальным, его нельзя использовать непосредственно как тип свойства. * Вы должны либо напрямую указать параметр типа, который дает вам контейнер, который всегда имеет определенное разнообразие EventValue
. :
struct DoubleEvent { // Please pick a better name, though
let time: Date
var value: EventValue<Double>?
}
Или сделайте контейнер также общим:
struct Event<T> {
let time: Date
var value: EventValue<T>?
}
В любом случае вам не нужно явно указывать тип при создании Event
: [115 ] Вывод типа заполнит его, когда сам Event
является родовым.
(Кроме того: обратите внимание, что у вас нет формального ограничения для T
, чтобы быть только Double
или Int
. Например, let event = Event(time: Date(), value: EventValue(value: "123abc"))
также возможен. Если вы действительно хотите этого избежать, ] Ответ Мартина Р. дает одно решение .)
* Не вдаваясь в подробности, это больше похоже на «вещь, которая создает тип», чем сам тип.