对对象列表进行排序和过滤

时间:2016-04-29 13:11:09

标签: java collections

我定义了一个Product类,如下所示:

public class Product {
    String name;
    ProductType type;
    BigDecimal price;
    // Getters and Setters omitted
}

ProductType作为enum类:

public enum ProductType {
    APPLE, PEAR, BANANA
}

现在我创建了一个List<Product>,我在其中添加了各种产品。我想做的是能够在价格上对此列表进行排序并在类型上对其进行过滤。

实施此类行为的标准方法是什么?

6 个答案:

答案 0 :(得分:4)

在Java 8中:

List<Product> products = // ...
List<Product> filterSortedProdycts = 
    products.stream()
            .filter(p -> p.getType() == ProductType.BANANA)  // only keep BANANA
            .sorted(Comparator.comparing(Product::getPrice)) // sort by price
            .collect(Collectors.toList());

答案 1 :(得分:1)

除了@MatthiasSteinbauer回答之外,您还可以为sortingfiler使用Java 8流。

排序:

products.stream()
        .sorted((p1, p2) -> p1.getPrice().compareTo(p2.getPrice())).collect(toList());

过滤

products.stream().filter(p -> p.getType().equals(givenType)).collect(toList());

答案 2 :(得分:1)

使用Java 8,我会说以下是按类型过滤和按价格排序的最标准方法:

Stream<Product> results = products.stream()
            .filter(p -> p.getType() == ProductType.BANANA)
            .sorted((l, r) -> l.getPrice().compareTo(r.getPrice()));

在没有Streams和Lambdas的Java 7中,我建议使用Google Guava。以下是有效的:

ImmutableList<Product> results = FluentIterable.from(products).filter(new Predicate<Product>() {
    @Override
    public boolean apply(Product input) {
        return input.getType() == ProductType.BANANA;
    }
}).toSortedList(new Comparator<Product>() {
    @Override
    public int compare(Product o1, Product o2) {
        return o1.getPrice().compareTo(o2.getPrice());
    }
});

为了便于阅读,我可能会将匿名内部类重构为命名类。

请注意,在这两种情况下都会创建一个包含结果的新列表。

答案 3 :(得分:0)

通常,您可以使用Collections.sort方法在课堂上实施Sortable。或者您使用更现代的流API,它提供了更简化的编程接口,并允许自动优化,例如促进多个处理器。

答案 4 :(得分:0)

标准Java库为一次性排序提供Collections.sort(),为永久排序的集合提供TreeSetTreeMap

答案 5 :(得分:0)

Collections.sort 是标准方式

您也可以使用Guava库:

看看这个StackOverflow question