java - 在 Java 8 中使用收集器的简单示例

标签 java lambda java-8 java-stream collectors

假设我有一个这样的文件:

1, Apple
1, Pear
1, Orange
2, Apple
3, Melon
3, Orange

我想将其解析为一个列表,其中每个条目都是一个映射,或者我猜它可能是我自己的对象,但我认为最好是映射,因为它是一个键。值(value)。

我在尝试:

private List<Map<String, String>> readRecords(String path) {
    return Files.lines(Paths.get(path))
            .map(line -> Arrays.asList(line.split(SEPARATOR)))
            .map(snippets -> new HashMap<Integer, String>().put(Integer.parseInt(snippets.get(0)), snippets.get(1)))
            .collect(Collectors.toList());
}  

但这给了我一个关于无法在 List<String> 之间转换的错误和 List<Map<String, String>>

或者也许有更好的方法来做到这一点?

最佳答案

除了返回类型不正确(List<Map<Integer, String>>)之外,put方法将为您提供之前映射的值(如果有)。

所以

.map(snippets -> new HashMap<Integer, String>().put(Integer.parseInt(snippets.get(0)), snippets.get(1)))

实际上是一个映射List<String> -> String而不是 List<String> -> Map<Integer, String> .

如果您想坚持使用官方 API,我会返回一个 List<SimpleEntry<Integer, String>>相反,因为每一行代表一个键值对并更改 map调用:

.map(snippets -> new SimpleEntry<>(Integer.parseInt(snippets.get(0)), snippets.get(1)))

... 或将全部内容收集到 Map<Integer, List<String>> 中(查看 groupingBy 收集器)。

关于java - 在 Java 8 中使用收集器的简单示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31809108/

相关文章:

java - 如何从代码中获取跟踪ID?

java - 即使未使用任何服务,也会出现泄漏窗口异常

java - 如何在保持排序的同时将排序的链表插入另一个排序的链表?

c# - 如何加入 2 个列表,其中一个列表包含 2 个元素?

java - 深入了解分离器特性

java - 为父类(super class)分配一个引用java

c# - 使用单个 lambda 表达式从满足给定条件的 int 数组中获取数字的总和

c# - 为什么 MSDN 站点上的这个 lambda 示例不起作用?

Java 8 流矩阵乘法比 For 循环慢 10 倍?

java - Comparator#comparing 按类属性的属性排序