Существует ли изящный способ удалить, аннулирует при преобразовании Набора с помощью Гуавы?

Подход, что я нашел работы для меня, имеет отдельные файлы JS для каждого класса (как Вы были бы в Java, C# и других). Кроме того, можно сгруппировать JS в функциональные области приложения, если это легче для Вас перейти.

при помещении всех файлов JS в один каталог Вы можете иметь свою среду серверной стороны (PHP, например) цикл через каждый файл в том каталоге и произвести <script src='/path/to/js/$file.js' type='text/javascript'> в некотором заголовочном файле, который включен всеми Вашими страницами UI. Вы найдете эту автозагрузку особенно удобной, если Вы регулярно создадите и удалите файлы JS.

При развертывании к производству, у Вас должен быть сценарий, который комбинирует их всех в один файл JS и "уменьшает" его для подавления размера.

59
задан Jonik 29 March 2013 в 10:18
поделиться

3 ответа

В Predicates уже есть предикат, который поможет вам здесь - Predicates.notNull () - и вы можете использовать Iterables.filter () и тот факт, что Lists.newArrayList () может принимать Iterable для очистки этого еще немного.

Collection<String> resourceIds = Lists.newArrayList(
  Iterables.filter(
     Iterables.transform(matchingComputers, yourFunction),
     Predicates.notNull()
  )
);

Если вам на самом деле не нужна Коллекция , только Iterable , тогда вызов Lists.newArrayList () может перейти прочь, и вы снова на один шаг чище!

Я подозреваю, что вы можете обнаружить, что функция снова пригодится,

80
ответ дан 24 November 2019 в 18:13
поделиться

Во-первых, я бы создал где-нибудь постоянный фильтр:

public static final Predicate<Object> NULL_FILTER =  new Predicate<Object>() {
    @Override
    public boolean apply(Object input) {
            return input != null;
    }
}

Затем вы можете использовать:

Iterable<String> ids = Iterables.transform(matchingComputers,
    new Function<Computer, String>() {
        public String apply(Computer from) {
             return from.getResourceId();
        }
    }));
Collection<String> resourceIds = Lists.newArrayList(
    Iterables.filter(ids, NULL_FILTER));

Вы можете использовать один и тот же нулевой фильтр повсюду в вашем коде.

Если вы используете ту же вычислительную функцию в другом месте, вы также можете сделать ее константой, оставив только:

Collection<String> resourceIds = Lists.newArrayList(
    Iterables.filter(
        Iterables.transform(matchingComputers, RESOURCE_ID_PROJECTION),
        NULL_FILTER));

Это конечно, не так хорошо, как был бы эквивалент C #, но все это будет много лучше в Java 7 с замыканиями и методами расширения :)

5
ответ дан 24 November 2019 в 18:13
поделиться

Вы можете написать свой собственный метод следующим образом. Это отфильтрует нули для любой Функции, которая возвращает null из метода apply.

   public static <F, T> Collection<T> transformAndFilterNulls(List<F> fromList, Function<? super F, ? extends T> function) {
        return Collections2.filter(Lists.transform(fromList, function), Predicates.<T>notNull());
    }

Затем метод можно вызвать с помощью следующего кода.

Collection c = transformAndFilterNulls(Lists.newArrayList("", "SD", "DDF"), new Function<String, Long>() {

    @Override
    public Long apply(String s) {
        return s.isEmpty() ? 20L : null;
    }
});
System.err.println(c);
1
ответ дан 24 November 2019 в 18:13
поделиться
Другие вопросы по тегам:

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