Укажите аргумент общего значения в качестве параметра вызова инициализации объекта

Я думаю, что второй лучше. 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"]
4
задан Josh Caswell 18 January 2019 в 19:41
поделиться

3 ответа

Если намерение состоит в том, чтобы иметь (один) тип 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))
0
ответ дан Martin R 18 January 2019 в 19:41
поделиться

Добавьте универсальный параметр в свою структуру 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))
0
ответ дан Robert Dresler 18 January 2019 в 19:41
поделиться

Поскольку 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")) также возможен. Если вы действительно хотите этого избежать, ] Ответ Мартина Р. дает одно решение .)


* Не вдаваясь в подробности, это больше похоже на «вещь, которая создает тип», чем сам тип.

0
ответ дан Josh Caswell 18 January 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: