Фильтровать коллекции, содержащие текст, используя Google Guava

Я использую структуру данных ImmutableList. Каков наилучший способ отфильтровать содержимое списка и вернуть все элементы, содержащие этот термин, в атрибуте description инвентаря.

3 ответа

Если вы в Java 8, попробуйте это:

ImmutableList<String> immutableList = ImmutableList.of("s1", "s2");
List<Object> collect = immutableList.stream().filter(s -> s.endsWith("1")).collect(Collectors.toList());
// collect: [s1]

Мое решение: вам нужно написать один предикат, который может принимать аргумент. Тогда отфильтруйте свою коллекцию с этим.

public static void main(String args[])  {

    Item i1 = new Item("Pen", "To write...");
    Item i2 = new Item("Phone","to call someone..." );

    List<Item> items = new ArrayList<Item>();

    items.add(i2);
    items.add(i1);

    Collection<Item> result = Collections2.filter(items, filterDescription("To write..."));

    for(Item item : result){
        System.out.println(item);
    }

}

Метод принимает аргумент и превращает предикат

public static Predicate<Item> filterDescription(final String desciption){
    return new Predicate<Item>() {

        @Override
        public boolean apply(Item input) {
           return input.getDescription() != null && input.getDescription().contains(desciption);
        }
    };
}

Результат:

--- exec-maven-plugin: 1.2.1: exec (default-cli) @ App ---

Item {description = To write..., title = Pen, цена =0.0, count=0}

С FluentIterable:

final String description = "search string";
final Iterable<Item> filtered = FluentIterable.from(unfiltered)
        .filter(new Predicate<Item>() {
            @Override
            public boolean apply(final Item input) {
               return input.getDescription().contains(desciption);
            }
        });

Вы можете создавать цепочки фильтров, преобразований (и т. Д.) С помощью FluentIterable. Если вы хотите получить список или набор, просто добавьте ".toList()" или ".toSet()" в конце.

Другие вопросы по тегам