如何使用Java 8 Lambdas执行以下操作

时间:2015-05-20 03:05:45

标签: java lambda

我有一组字符串如下

Set<String> ids;

每个ID的格式为#userId:#sessionId,例如1:2其中1是userId,2是sessionId。

我想将这些分成userId,这将是HashMap中的关键,每个userId都是唯一的。但每个userId可以有多个会话。那么如何从Set<String>Map<String, List<String>>

获取值

例如

如果集合包含以下值{1:2, 2:2, 1:3} 地图应包含

key=1 value=<2,3>
key=2 value=<2>

2 个答案:

答案 0 :(得分:0)

通过“lambdas”我假设你的意思是流,因为构建地图的简单循环并不需要lambdas。如果是这样,你可以使用一些内置的Collectors来接近但不完全相同。

Map<String, List<String>> map = ids.stream()
    .collect(Collectors.groupingBy(id -> id.split(":")[0]));

// result: {"1": ["1:2", "1:3"], "2": ["2:2"]}

这将按左数字分组,但会将完整字符串存储在地图值中,而不是仅存储在右侧部分。

Map<String, List<String>> map = ids.stream()
    .collect(Collectors.toMap(
        id -> id.split(":")[0],
        id -> new ArrayList<>(Arrays.asList(id.split(":")[1])),
        (l1, l2) -> {
            List<String> l3 = new ArrayList<>(l1);
            l3.addAll(l2);
            return l3;
        }
    );

// result: {"1": ["2", "3"], "2": ["2"]}

这将完全返回您想要的,但遭受严重的低效率。它不是将所有相等的元素添加到单个列表中,而是创建许多临时列表并将它们连接在一起。这将O(n)操作转变为O(n 2 )操作。

答案 1 :(得分:-1)

您可以使用HashMap<Integer,Set<T>>HashMap<Integer,List<T>>,其中T是value1,value2等的类型。

我认为您要求similar to this question

此外,这是how to proceed with this problem上几个解决方案的链接。