Java 8 - Stream - 引用复合对象

问题描述 投票:-3回答:3

我有List<Entry> entries,代码结构如下,

class Entry {
    public Product getProduct() {
        return product;
    }
}

class Product {

    public List<CategoriesData> getCategories() {
        return categoriesData;
    }
}

class CategoriesData {

    public String getName() {
        return name;
    }
}

我正在寻找按产品排序 - CategoriesData - 名称(来自List<CategoriesData>的第一个元素)

// Not sure how to refer Name within CategoriesData, 
// entries.stream().sorted(
//   Comparator.comparing(Entry::getProduct::getCategories::getName))
//                      .collect(Collectors.toList())
java lambda java-8 java-stream
3个回答
0
投票

使用Mureinik解决方案,您可以:

Comparator<Entry> entryComperator = Comparator
                .comparing(e -> e.getProduct().getCategories().get(0).getName());
        List<Entry> sorted =
                entries.stream()
                        .sorted(entryComperator)
                        .collect(Collectors.toList());

如果列表为空,您可以考虑更好地从列表中访问该名称。你可以像我上面那样在比较器中隐藏所有这些逻辑


0
投票

如果您尝试按第一个类别排序,则需要在比较器中引用它:

List<Entry> sorted = 
    entries.stream()
           .sorted(Comparator.comparing(
                                  e -> e.getProduct().getCategories().get(0).getName())
           .collect(Collectors.toList())

编辑: 要回答评论中的问题,对于二级排序,您必须在Comparator中指定类型:

List<Entry> sorted = 
    entries.stream()
           .sorted(Comparator.comparing(
                                  e -> e.getProduct().getCategories().get(0).getName())
                             .thenComparing(
                                  (Entry e) -> e.getProduct().getName())
           .collect(Collectors.toList())

0
投票

随着来自@Mureinik的输入并进行了一些修改,我最终得到了以下内容并且它正在运行。我的要求略有改变,我需要在地图中得到结果。类别名称是地图中的关键,值将是“条目”列表。

 final Map<String, List<Entry>> sortedMap =
        data.getEntries().stream()
        .sorted(Comparator.comparing(e -> ((Entry) e).getProduct().getCategories().stream().findFirst().get().getName())
               .thenComparing(Comparator.comparing(e -> ((Entry) e).getProduct().getName())) )
        .collect(Collectors.groupingBy(e -> e.getProduct().getCategories().stream().findFirst().get().getName(),
                 LinkedHashMap::new, Collectors.toList())); 
© www.soinside.com 2019 - 2024. All rights reserved.