Java 使用流合并列表<;配对<;A、 B>&燃气轮机;列出<;配对<;A、 列表<;B>&燃气轮机&燃气轮机;基于关键值

Java 使用流合并列表<;配对<;A、 B>&燃气轮机;列出<;配对<;A、 列表<;B>&燃气轮机&燃气轮机;基于关键值,java,java-8,java-stream,Java,Java 8,Java Stream,我现在正在学习Java8流,我很好奇有没有方便的方法将List转换为List,也就是按键合并pair的值 我曾经想过使用forEach方法,但它似乎效率较低,因为我需要遍历新列表来检查pair的密钥。我建议使用a(它也支持条目的插入顺序)而不是list。使用它,您只需使用Collectors.groupingBy()和Collectors.mapping()即可实现: List<Pair<A, B>> list = ...; Map<A, List<B>

我现在正在学习Java8流,我很好奇有没有方便的方法将
List
转换为
List
,也就是按键合并pair的值

我曾经想过使用
forEach
方法,但它似乎效率较低,因为我需要遍历新列表来检查pair的密钥。

我建议使用a(它也支持条目的插入顺序)而不是
list
。使用它,您只需使用
Collectors.groupingBy()
Collectors.mapping()
即可实现:

List<Pair<A, B>> list = ...;
Map<A, List<B>> result = list.stream()
        .collect(Collectors.groupingBy(Pair::getKey, LinkedHashMap::new, 
                Collectors.mapping(Pair::getValue, Collectors.toList())));

b/c我需要遍历新的对列表,找到每对的重复键A,然后向列表中插入相应的值。如果使用
Set
Map
,概念数据结构/模型将更清楚地描述,例如:
list
->
Map
。然后我们知道(A的)输出键必须是唯一的,每个键中(B的)值也必须是唯一的(但是,默认情况下,映射/设置保证顺序都不是唯一的)。这也指导了HashMap和HashSet作为实现的潜在用途,以便在顺序不相关时相对有效地处理操作。@user2864740您是对的,但考虑到可能存在按键A排序的值后,我不想破坏它。我很好奇是否只使用linkedHashMap,在我调用linkedHashMap.steam().collector(Collectors.toMap())之后,它是否会保留订单?@WilliamZ如果您使用
linkedHashMap::new
作为mapFactory供应商是,如果不是,否。如果您不提供mapFactory,则使用
HashMap
(无序)。
List<Pair<A, B>> list = ...;
List<Pair<A, List<B>>> result = list.stream()
        .collect(Collectors.groupingBy(Pair::getKey, LinkedHashMap::new, 
                Collectors.mapping(Pair::getValue, Collectors.toList())))
        .entrySet().stream()
        .map(e -> new Pair<>(e.getKey(), e.getValue()))
        .collect(Collectors.toList());
List<Pair<A, B>> list = ...;
Map<A, Set<B>> result = list.stream()
        .collect(Collectors.groupingBy(Pair::getKey, LinkedHashMap::new, 
                Collectors.mapping(Pair::getValue, Collectors.toCollection(LinkedHashSet::new))));