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

标签 java io java-8 nio java-stream

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

public Entity(int id, String name, double weight)

文本文件包含以下内容:

ID,NAME,WEIGHT
1,Mario,80.2
2,Marco,91.1
...
100,Diego,78.12

使用新的 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])
                ));
            }
        }
    }
}

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

List<Entity> entities = Files.lines(Paths.get(SOURCE_FILE)).collect(...);

最佳答案

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

代码注意事项:您应该使用 truefalse,而不是 Boolean.TRUEBoolean.FALSE (它们是 boolean 值的实例,而不是原始 boolean 值)。

关于Java 8 & NIO/读取行 -> 收集到实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24979611/

相关文章:

java - 分页逻辑怎么写?

java - 另一个线程的监听器

io - 什么时候轮询比中断好?

java - `thenRunAsync(...)` 和 `CompletableFuture.runAsync(() -> { ... });` 有关联吗?

java - Hibernate - Java8 函数对象可以保存在数据库中吗?

java - 为什么克隆时不执行构造函数

java - 我应该使用嵌套枚举吗?

java - Netty 乒乓球与 POJO

c - 为什么我的 fread 会返回一个空字符串?

Java:JComboBox addItem函数与jdk8和jdk7不同