Это ожидаемое поведение, вы можете запретить отправку кнопки 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);
}
С лямбдами 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();
}
});
Возможность изменения вашей коллекции на месте или нет, зависит от класса объектов в коллекции.
Если эти объекты являются неизменяемыми (то есть строками), то вы не можете просто взять элементы из коллекции и изменить их - вместо этого вам нужно будет выполнить итерацию по коллекции, вызвать соответствующую функцию и затем вернуть полученное значение обратно .
Возможно, что-то излишнее, но есть ряд действительно хороших утилит для подобных проблем в Библиотека 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.
Вам придется перебирать все записи и обрезать каждое строковое значение. Поскольку String является неизменным, вам придется заново поместить его на карту. Лучшим подходом может быть обрезка значений по мере их размещения на карте.
Я не знаю способа сделать это с библиотеками 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
существует для коллекций.
Я придумал класс "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();