Java 8和NIO /读取行 - >收集到实体

Ant*_*sev 0 java io nio java-8 java-stream

需要逐行读取文本并根据对象Entity成员的值解析每个文本.我的实体有下一个构造函数签名:

public Entity(int id, String name, double weight)
Run Code Online (Sandbox Code Playgroud)

文本文件有下一个内容:

ID,NAME,WEIGHT
1,Mario,80.2
2,Marco,91.1
...
100,Diego,78.12
Run Code Online (Sandbox Code Playgroud)

使用新的Java 8:Files::readAllLines方法我的解决方案非常庞大:

public class CoolApp {

    private static final String SOURCE_FILE = "path/to/txt/file/entities.txt";

    private static final int ID     = 0;
    private static final int NAME   = 1;
    private static final int WEIGHT = 2;

    public static void main(String[] args) throws Exception {
        boolean isHeader = true;

        List<Entity> entities = new ArrayList<>();

        for (String line : Files.readAllLines(Paths.get(SOURCE_FILE))) {
            if (isHeader) {
                isHeader = false;
            }   
            else {
                String[] snippets = line.split(",");

                entities.add(new Entity(
                        Integer.parseInt(snippets[ID]),
                        snippets[NAME],
                        Double.parseDouble(snippets[WEIGHT])
                ));
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何能够执行相同的操作,但使用收集器在实体集合中呈现数据,如下所示?

List<Entity> entities = Files.lines(Paths.get(SOURCE_FILE)).collect(...);
Run Code Online (Sandbox Code Playgroud)

JB *_*zet 7

List<Entity> entities = 
    Files.lines(Paths.get(SOURCE_FILE))
         .skip(1) // skip the header line
         .map(line -> line.split(",")) // transform each line to an array
         .map(snippets -> new Entity(Integer.parseInt(snippets[ID]),
                                     snippets[NAME],
                                     Double.parseDouble(snippets[WEIGHT])) // transform each array to an entity
         .collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)

关于你的代码的注意事项:你应该使用trueand false而不是Boolean.TRUEBoolean.FALSE(它们是布尔值而不是原始布尔值的实例).