Предположение, что Вы используете Java 1.5, и что Вы не можете добавить Google Collections , я сделал бы что-то очень похожее на то, что сделали парни Google. Это - небольшое изменение на комментариях Jon.
Первый добавляют этот интерфейс к Вашей кодовой базе.
public interface IPredicate { boolean apply(T type); }
Его лица, осуществляющие внедрение могут ответить, когда определенный предикат верен для определенного типа. Например, Если T
были User
и AuthorizedUserPredicate
реализации IPredicate
, то AuthorizedUserPredicate#apply
возвраты, авторизовывается ли переданный в [1 113].
Тогда в некотором служебном классе, Вы могли сказать
public static Collection filter(Collection target, IPredicate predicate) {
Collection result = new ArrayList();
for (T element: target) {
if (predicate.apply(element)) {
result.add(element);
}
}
return result;
}
Так, предположив, что у Вас есть использование вышеупомянутого, мог бы быть
Predicate isAuthorized = new Predicate() {
public boolean apply(User user) {
// binds a boolean method in User to a reference
return user.isAuthorized();
}
};
// allUsers is a Collection
Collection authorizedUsers = filter(allUsers, isAuthorized);
, Если производительность на линейной проверке вызывает беспокойство, то я мог бы хотеть иметь объект области, который имеет целевой набор. Объект области, который имеет целевой набор, имел бы логику фильтрации для методов, которые инициализируют, добавляют и устанавливают целевой набор.
ОБНОВЛЕНИЕ:
В служебном классе (скажем, Предикат), я добавил избранный метод с опцией для значения по умолчанию, когда предикат не возвращает математическое ожидание, и также статическое свойство для параметрических усилителей, которые будут использоваться в новом IPredicate.
public class Predicate {
public static Object predicateParams;
public static Collection filter(Collection target, IPredicate predicate) {
Collection result = new ArrayList();
for (T element : target) {
if (predicate.apply(element)) {
result.add(element);
}
}
return result;
}
public static T select(Collection target, IPredicate predicate) {
T result = null;
for (T element : target) {
if (!predicate.apply(element))
continue;
result = element;
break;
}
return result;
}
public static T select(Collection target, IPredicate predicate, T defaultValue) {
T result = defaultValue;
for (T element : target) {
if (!predicate.apply(element))
continue;
result = element;
break;
}
return result;
}
}
следующий пример ищет пропавших без вести объектов между наборами:
List missingObjects = (List) Predicate.filter(myCollectionOfA,
new IPredicate() {
public boolean apply(MyTypeA objectOfA) {
Predicate.predicateParams = objectOfA.getName();
return Predicate.select(myCollectionB, new IPredicate() {
public boolean apply(MyTypeB objectOfB) {
return objectOfB.getName().equals(Predicate.predicateParams.toString());
}
}) == null;
}
});
следующий пример, ищет экземпляр в наборе и возвращает первый элемент набора как значение по умолчанию, когда экземпляр не найден:
MyType myObject = Predicate.select(collectionOfMyType, new IPredicate() {
public boolean apply(MyType objectOfMyType) {
return objectOfMyType.isDefault();
}}, collectionOfMyType.get(0));
ОБНОВЛЕНИЕ (после того, как выпуск Java 8):
Это были несколько лет, с тех пор как я (Alan) сначала отправил этот ответ, и я все еще не могу полагать, что собираю ТАК точки для этого ответа. Во всяком случае, теперь, когда Java 8 представил закрытия языку, мой ответ теперь значительно отличался бы, и был бы более простым. С Java 8 нет никакой потребности в отличном статическом служебном классе. Таким образом, если Вы хотите найти 1-й элемент, который соответствует Вашему предикату.
final UserService userService = ... // perhaps injected IoC
final Optional userOption = userCollection.stream().filter(u -> {
boolean isAuthorized = userService.isAuthorized(u);
return isAuthorized;
}).findFirst();
JDK 8 API для optionals имеет способность к [1 114], isPresent()
, orElse(defaultUser)
, orElseGet(userSupplier)
и orElseThrow(exceptionSupplier)
, а также другие 'одноместные' функции такой как [1 119], flatMap
и filter
.
, Если Вы хотите просто забрать всех пользователей, которые соответствуют предикату, затем используйте Collectors
для завершения потока в желаемом наборе.
final UserService userService = ... // perhaps injected IoC
final List userOption = userCollection.stream().filter(u -> {
boolean isAuthorized = userService.isAuthorized(u);
return isAuthorized;
}).collect(Collectors.toList());
Видят здесь для большего количества примеров о том, как Java 8 потоков работает.
Вы можете использовать Pattern.quote (String)
.
Из документов:
public static String quote (String s)
Возвращает шаблон литерала
String
для указаннойString
.Этот метод создает строку, которую можно использовать для создания шаблона, который соответствовал бы строке s, как если бы это был шаблон литерала.
Метасимволы или escape-последовательности во входной последовательности не будут иметь особого значения.
Pattern.compile ()
отлично подходят квадратные скобки. Если вы возьмете строку
".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]"
и разделите ее на запятые, вы получите пять совершенно корректных регулярных выражений: первое соответствует восьми символам, не являющимся разделителями строк, второе - цифре ASCII и так далее. Если вы действительно не хотите сопоставить строки вроде ". {8}"
и "[0-9]"
, я не понимаю, зачем вам нужно избегать чего-либо.
Вы можете использовать специальные символы \ Q и \ E ... все, что находится между \ Q и \ E, автоматически экранируется.
\Q[0-9]\E