Предположение, что Вы используете 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 потоков работает.
Восстановление начальной загрузки Установки на человечности следующими шагами
Открывает терминал и выполняет следующие команды
sudo add-apt-repository ppa:yannubuntu/boot-repair
sudo apt-get update
sudo apt-get install boot-repair
После завершения установки, можно запустить его из меню System-> Administration-> Boot-Repair, если Вы используете Gnome или ищете "восстановление начальной загрузки" в тире при использовании Единицы. Тогда следуйте следующим снимкам экрана:
Метод 1
Нажимают Apply и Reboot система
Метод 2