Java Stream API收集方法

时间:2019-06-25 07:01:08

标签: java java-stream

有班人:

class Person {
    private String id;
    private String name;
    private int age;
    private int amount;
}

我使用外部文件创建了HashMapPerson,其中包含以下行:

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]))));

(IntelijIdea用红色下划线标为“ a [0]”,并表示“期望的数组类型,找到的是lambda参数”)

5 个答案:

答案 0 :(得分:10)

您应该使用map才能将每个数组映射到相应的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()返回一个List,而不是ArrayList(即使默认实现确实返回了ArrayList,您也不能指望)。

>

答案 1 :(得分:2)

在尝试var elem = document.getElementsByClassName("menu-wrapper")[0]; this.hammer.on("swiperight", () => elem.dispatchEvent(wheeleventRight)); this.hammer.on("swipeleft", () => elem.dispatchEvent(wheeleventLeft)); 之前,您需要先将其mapPerson对象:

collect

答案 2 :(得分:1)

为什么要映射两次?您可以直接执行此操作,

.map(s -> {
            String[] parts = s.split(",");
            return new Person(parts[0],parts[1],Integer.valueOf(parts[2]),Integer.valueOf(parts[3]));
        }).collect(Collectors.toList());

答案 3 :(得分:1)

我建议向您的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());
}

答案 4 :(得分:0)

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

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应该适合您的操作。