Набор/карта Java применяет эквивалентный метод?

Это ожидаемое поведение, вы можете запретить отправку кнопки enter для формы, подобной этой:

document.querySelector('form').addEventListener('submit', function (e) {
        e.preventDefault();
}, false); 

или для каждого элемента ввода:

 function onLoad() {
     var options = { maxResults: 8 };
     initAutosuggestControl(options, "searchBox", "searchBoxContainer");
     initAutosuggestControl(options, "searchBoxAlt", "searchBoxContainerAlt");

     disableInputSubmit(document.querySelector('#searchBox'));
     disableInputSubmit(document.querySelector('#searchBoxAlt'));
 }

где [ 116]

function disableInputSubmit(element) {
     element.addEventListener('keypress', function(e){
         if (e.which === 13) // Enter key = keycode 13
         {
            e.preventDefault();
         }
     },false);
}
24
задан joshjdevl 13 April 2009 в 16:30
поделиться

7 ответов

С лямбдами Java 8, это один вкладыш:

map.replaceAll((k, v) -> v.trim());

Ради истории, вот версия без лямбды:

public void trimValues(Map<?, String> map) {
  for (Map.Entry<?, String> e : map.entrySet()) {
    String val = e.getValue();
    if (val != null)
      e.setValue(val.trim());
  }
}

Или, в более общем случае:

interface Function<T> {
  T operate(T val);
}

public static <T> void replaceValues(Map<?, T> map, Function<T> f)
{
  for (Map.Entry<?, T> e : map.entrySet())
    e.setValue(f.operate(e.getValue()));
}

Util.replaceValues(myMap, new Function<String>() {
  public String operate(String val)
  {
    return (val == null) ? null : val.trim();
  }
});
37
ответ дан 28 November 2019 в 22:59
поделиться

Возможность изменения вашей коллекции на месте или нет, зависит от класса объектов в коллекции.

Если эти объекты являются неизменяемыми (то есть строками), то вы не можете просто взять элементы из коллекции и изменить их - вместо этого вам нужно будет выполнить итерацию по коллекции, вызвать соответствующую функцию и затем вернуть полученное значение обратно .

2
ответ дан 28 November 2019 в 22:59
поделиться

Возможно, что-то излишнее, но есть ряд действительно хороших утилит для подобных проблем в Библиотека Apache Commons Collections .

Map<String, String> map = new HashMap<String, String>(); 
map.put("key1", "a  ");
map.put("key2", " b ");
map.put("key3", "  c");

TransformedMap.decorateTransform(map, 
  TransformerUtils.nopTransformer(), 
  TransformerUtils.invokerTransformer("trim"));

Я настоятельно рекомендую Jakarta Commons Cookbook от O'Reilly.

2
ответ дан 28 November 2019 в 22:59
поделиться

Вам придется перебирать все записи и обрезать каждое строковое значение. Поскольку String является неизменным, вам придется заново поместить его на карту. Лучшим подходом может быть обрезка значений по мере их размещения на карте.

1
ответ дан 28 November 2019 в 22:59
поделиться

Вы также можете взглянуть на Google Collections

-1
ответ дан 28 November 2019 в 22:59
поделиться

Я не знаю способа сделать это с библиотеками JDK, кроме вашего принятого ответа, однако Google Collections позволяет вам делать следующее с классами com.google. collect.Maps и com.google.common.base.Function :

Map<?,String> trimmedMap = Maps.transformValues(untrimmedMap, new Function<String, String>() {
  public String apply(String from) {
    if (from != null)
      return from.trim();
    return null;
  }
}

Самым большим отличием этого метода от предлагаемого является то, что он обеспечивает просмотр исходной карты, а это означает, что , хотя он всегда синхронизирован с вашей исходной картой, метод apply может вызываться много раз, если вы сильно манипулируете указанной картой.

Аналогичный метод Collections2.transform (Collection , Function ) существует для коллекций.

11
ответ дан 28 November 2019 в 22:59
поделиться

Я придумал класс "Mapper"

public static abstract class Mapper<FromClass, ToClass> {

    private Collection<FromClass> source;

    // Mapping methods
    public abstract ToClass map(FromClass source);

    // Constructors
    public Mapper(Collection<FromClass> source) {
        this.source = source;
    }   
    public Mapper(FromClass ... source) {
        this.source = Arrays.asList(source);
    }   

    // Apply map on every item
    public Collection<ToClass> apply() {
        ArrayList<ToClass> result = new ArrayList<ToClass>();
        for (FromClass item : this.source) {
            result.add(this.map(item));
        }
        return result;
    }
}

Который я использую вот так :

Collection<Loader> loaders = new Mapper<File, Loader>(files) {
    @Override public Loader map(File source) {
        return new Loader(source);
    }           
}.apply();
1
ответ дан 28 November 2019 в 22:59
поделиться
Другие вопросы по тегам:

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