Java Stream API 收集方法

有类人:


class Person {

    private String id;

    private String name;

    private int age;

    private int amount;

}

我创建HashMap的Persons 使用外部文件包含行:


001,aaa,23,1200

002,bbb,24,1300

003,ccc,25,1400

004,ddd,26,1500

Mainclass.java


public 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 参数”)


紫衣仙女
浏览 126回答 5
5回答

手掌心

您应该使用maporder 将每个数组映射到相应的Person实例:al&nbsp;=&nbsp;br.lines().map(s&nbsp;->&nbsp;s.split(",")) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map&nbsp;(a&nbsp;->&nbsp;new&nbsp;Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3]))) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.collect(Collectors.toList());顺便说一句,Collectors.toList()返回 a&nbsp;List,而不是 an&nbsp;ArrayList(即使默认实现确实 return&nbsp;ArrayList,你也不能指望它)。

翻阅古今

在尝试之前,您需要先将map其添加到对象中:Personcollect.map(s&nbsp;->&nbsp;s.split(",")) .map(a&nbsp;->&nbsp;new&nbsp;Person(a[0],a[1],Integer.valueOf(a[2]),Integer.valueOf(a[3]))&nbsp;//here .collect(Collectors.toList())

慕标琳琳

我建议向您的 person 类添加一个静态方法(或根据构造函数)来解析 CSV 字符串:public static Person fromCSV(String csv) {&nbsp; &nbsp; String[] parts = csv.split(",");&nbsp; &nbsp; if (parts.length != 4) {&nbsp; &nbsp; &nbsp; &nbsp; throw new IllegalArgumentException("csv has not 4 parts");&nbsp; &nbsp; }&nbsp; &nbsp; 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"))) {&nbsp; &nbsp; List<Person> persons = lines&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .map(Person::fromCSV)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; .collect(Collectors.toList());}

莫回无

为什么要映射两次?你可以直接这样做,.map(s -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] parts = s.split(",");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new Person(parts[0],parts[1],Integer.valueOf(parts[2]),Integer.valueOf(parts[3]));&nbsp; &nbsp; &nbsp; &nbsp; }).collect(Collectors.toList());

互换的青春

您所做的是正确的,唯一缺少的是您在 collect 中创建了 Person 对象,而不是您可以在 map 方法本身内部创建它并返回它,并将 collect 方法与 Collectors.toList() 方法一起使用。下面的代码片段将很好地理解我要传达的内容:al= br.lines()&nbsp; &nbsp; &nbsp; .map(s -> {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; String[] subStrings = s.split(",");&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; return new Person(subStrings[0], subStrings[1], Integer.valueOf(subStrings[2]), Integer.valueOf(subStrings[3]));&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; })&nbsp; &nbsp; &nbsp; .collect(Collectors.toList());这样您只使用一次 map 方法,并返回 collect 方法合并到 List 中所需的对象。如果您希望它成为 ArrayList,您可以使用 Collections 框架将 List 转换为 ArrayList,但我认为 List 应该适合您的操作。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java