Как выйти из квадратной скобки для компиляции Шаблона

Предположение, что Вы используете 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 потоков работает.

26
задан Cullub 29 March 2016 в 17:49
поделиться

3 ответа

Вы можете использовать Pattern.quote (String) .

Из документов:

public static String quote (String s)

Возвращает шаблон литерала String для указанной String .

Этот метод создает строку, которую можно использовать для создания шаблона, который соответствовал бы строке s, как если бы это был шаблон литерала.

Метасимволы или escape-последовательности во входной последовательности не будут иметь особого значения.

24
ответ дан 28 November 2019 в 06:23
поделиться

Pattern.compile () отлично подходят квадратные скобки. Если вы возьмете строку

".{8},[0-9],[^0-9A-Za-z ],[A-Z],[a-z]"

и разделите ее на запятые, вы получите пять совершенно корректных регулярных выражений: первое соответствует восьми символам, не являющимся разделителями строк, второе - цифре ASCII и так далее. Если вы действительно не хотите сопоставить строки вроде ". {8}" и "[0-9]" , я не понимаю, зачем вам нужно избегать чего-либо.

3
ответ дан 28 November 2019 в 06:23
поделиться

Вы можете использовать специальные символы \ Q и \ E ... все, что находится между \ Q и \ E, автоматически экранируется.

\Q[0-9]\E
13
ответ дан 28 November 2019 в 06:23
поделиться
Другие вопросы по тегам:

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