繁体   English   中英

Java Stream - 创建一个 Map 的排序重复

[英]Java Stream - Create a Map of Sorted Duplicates

我有一个对象列表,其中一些对象共享相似的 ID,但是属性的 rest 不同。 我知道如何按相似的 ID 对它们进行分组...

...
.stream()
.collect(groupingBy(obj -> obj.id, mapping(obj -> obj, toList())));

但是我想添加一层额外的逻辑。 我希望Map中的每个List都按两个条件排序。

第一个条件,我想使用contains检查obj.specialId是否存在于单独的Set中。 如果不是,那很好,但如果是,那么我希望 object 在Set中排在第一位。 类似specialSet.contains(obj.specialId)的东西。

第二个条件是我想让它们按日期排序。 这些对象有一个名为 date 的属性obj.date

条件并不重要,我最困惑的是如何保留Map中值的顺序。 一旦我知道如何做到这一点,添加我想要的条件应该很容易。

据我了解,您需要从使用 set 切换到使用 list 才能保持元素之间的顺序。 然后你需要三个基本的代码:

  1. 诸如 lambda: Thing::getId类的分类器,这意味着使用 id 对它们进行分组。
  2. 数据结构的供应商表达式 map 是 go 的最简单方法: HashMap::new
  3. 用于处理分组元素的收集器,例如Collectors.collectingAndThen(...)

一个完整的例子:

public class Sandbox {


    public static <T> List<T> doThingWithList( List<T> list) {
        /**
         * Do some fancy things on your grouped elements
         * Such as sorting them
         */
        return list;
    }

    public static void main(String[] args){
        List<Thing> things = new ArrayList<>();
        things.add(new Thing(1,"first", "first ever"));
        things.add(new Thing(2,"second", "almost got first place"));
        things.add(new Thing(2,"second","sharing the second place is better than finishing third"));

        Map<Integer,List<Thing>> result = things.stream()
                .collect(
                        Collectors.groupingBy(Thing::getId, HashMap::new,
                                Collectors.collectingAndThen(Collectors.toList(), Sandbox::doThingWithList))
                );
        System.out.println(result);
    }

}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM