使用lambda将列表转换为映射,但长度有限

5 java java-8 java-stream

我正在尝试使用groupingBy(...)lambda中的函数创建一个地图.现在我面临的问题是我无法将列表转换为特定条件的映射

码:

List<Integer> list = IntStream
                       .range(0,120)
                       .mapToObj(Integer::new)
                       .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

预期功能:

我需要收集一个地图,其键是键值,如0到120之间的键,值会增加

[]
[0]
[0, 1]
[0, 1, 2]
[0, 1, 2, 3]
[0, 1, 2, 3, 4]
[0, 1, 2, 3, 4, 5]
[0, 1, 2, 3, 4, 5, 6]
[0, 1, 2, 3, 4, 5, 6, 7]
[0, 1, 2, 3, 4, 5, 6, 7, 8]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
.
.
.
//so on upto 120


Map<Integer, List<Integer>> myMapOne = new HashMap<>();
        for (Integer inteter : list) {
            myMapOne.put(inteter, list.subList(0, list.indexOf(inteter)));
        }
Run Code Online (Sandbox Code Playgroud)

我在想什么(想法):

Map<Integer, Integer> myMap = list
                              .stream()
                             .collect(Collectors.groupingBy(Integer::new, list.subList(0, Integer::new)));
Run Code Online (Sandbox Code Playgroud)

错误:无法转换为List内部groupingBy()或不确定我是否遗漏了某些内容

怎么解决这个?欢迎任何帮助

编辑:

我需要在这里使用方法参考吗?

以下是方法

public static List<Integer> getList(Integer index, List<Integer> list) {
    return list.subList(0, list.indexOf(index));
}
Run Code Online (Sandbox Code Playgroud)

use*_*547 7

你可以这样做:

IntStream.range(0, 120)
    .boxed()
    .collect(Collectors.toMap(
        x -> x, 
        y -> IntStream.range(0, y).boxed().collect(Collectors.toList())));
Run Code Online (Sandbox Code Playgroud)

而不是.mapToObj(Integer::new),你可以使用boxed().然后,您可以使用toMap()将值映射到键和值.关键是身份,所以你可以使用just x->x,值是一个新的列表,可以用它创建IntStream.range(0, y).boxed().collect(Collectors.toList())

  • 那么`groupingBy(..)`的问题在于,它在一定条件下对其元素进行分组.因此虽然可以用`groupingBy()`来解决它,但它不是一个"自然"解决方案,因为你不想进行任何分组.仅仅因为它可以用于创建Map,并不意味着它非常适合这种问题. (4认同)