为了账号安全,请及时绑定邮箱和手机立即绑定

Java Stream API 收集方法

Java Stream API 收集方法

紫衣仙女 2023-02-16 15:48:44
有类人:class Person {    private String id;    private String name;    private int age;    private int amount;}我创建HashMap的Persons 使用外部文件包含行:001,aaa,23,1200002,bbb,24,1300003,ccc,25,1400004,ddd,26,1500Mainclass.javapublic class Mainclass {public static void main(String[] args) throws IOException {    List<Person> al = new ArrayList<>();    Map<String,Person> hm = new HashMap<>();    try (BufferedReader br = new BufferedReader(new FileReader("./person.txt"))) {        hm = br.lines().map(s -> s.split(","))                .collect(Collectors.toMap(a -> a[0], a-> new Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3]))));    }}}它适用于HashMap.如何为 做同样的事情ArraList?我试过:    al = br.lines().map(s -> s.split(","))                    .collect(Collectors.toList(a -> new Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3]))));(IntellijIdea 带有红色下划线“a[0]”并表示“数组类型已排除,已找到:lambda 参数”)
查看完整描述

5 回答

?
手掌心

TA贡献1942条经验 获得超3个赞

您应该使用maporder 将每个数组映射到相应的Person实例:

al = br.lines().map(s -> s.split(","))
               .map (a -> new Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3])))
               .collect(Collectors.toList());

顺便说一句,Collectors.toList()返回 a List,而不是 an ArrayList(即使默认实现确实 return ArrayList,你也不能指望它)。


查看完整回答
反对 回复 2023-02-16
?
翻阅古今

TA贡献1780条经验 获得超5个赞

在尝试之前,您需要先将map其添加到对象中:Personcollect

.map(s -> s.split(","))
.map(a -> new Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3])) //here
.collect(Collectors.toList())


查看完整回答
反对 回复 2023-02-16
?
慕标琳琳

TA贡献1830条经验 获得超9个赞

我建议向您的 person 类添加一个静态方法(或根据构造函数)来解析 CSV 字符串:


public static Person fromCSV(String csv) {

    String[] parts = csv.split(",");

    if (parts.length != 4) {

        throw new IllegalArgumentException("csv has not 4 parts");

    }

    return new Person(parts[0], parts[1], Integer.parseInt(parts[2]), Integer.parseInt(parts[3]));

}

要阅读您可以选择使用的行Files.lines()。使用您可以使用的所有内容来创建您List<Person>:


try (Stream<String> lines = Files.lines(Paths.get("./person.txt"))) {

    List<Person> persons = lines

            .map(Person::fromCSV)

            .collect(Collectors.toList());

}


查看完整回答
反对 回复 2023-02-16
?
莫回无

TA贡献1865条经验 获得超7个赞

为什么要映射两次?你可以直接这样做,


.map(s -> {

            String[] parts = s.split(",");

            return new Person(parts[0],parts[1],Integer.valueOf(parts[2]),Integer.valueOf(parts[3]));

        }).collect(Collectors.toList());


查看完整回答
反对 回复 2023-02-16
?
互换的青春

TA贡献1797条经验 获得超6个赞

您所做的是正确的,唯一缺少的是您在 collect 中创建了 Person 对象,而不是您可以在 map 方法本身内部创建它并返回它,并将 collect 方法与 Collectors.toList() 方法一起使用。下面的代码片段将很好地理解我要传达的内容:


al= br.lines()

      .map(s -> {

                    String[] subStrings = s.split(",");

                    return new Person(subStrings[0], subStrings[1], Integer.valueOf(subStrings[2]), Integer.valueOf(subStrings[3]));

                })

      .collect(Collectors.toList());

这样您只使用一次 map 方法,并返回 collect 方法合并到 List 中所需的对象。如果您希望它成为 ArrayList,您可以使用 Collections 框架将 List 转换为 ArrayList,但我认为 List 应该适合您的操作。


查看完整回答
反对 回复 2023-02-16
  • 5 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信