Java 从文本文件中拆分流并放入列表

Java 从文本文件中拆分流并放入列表,java,lambda,split,java-8,java-stream,Java,Lambda,Split,Java 8,Java Stream,如何使用流将从文本文件读取的所有元素放入数组列表,其中monitoredata类有以下3个私有变量:私有日期开始时间、日期完成时间、字符串活动标签 文本文件Activities.txt如下所示: 2011-11-28 02:27:59 2011-11-28 10:18:11 Sleeping 2011-11-28 10:21:24 2011-11-28 10:23:36 Toileting 2011-11-28 10:25:44 20

如何使用流将从文本文件读取的所有元素放入
数组列表
,其中monitoredata类有以下3个私有变量:
私有日期开始时间、日期完成时间、字符串活动标签

文本文件Activities.txt如下所示:

2011-11-28 02:27:59     2011-11-28 10:18:11     Sleeping        
2011-11-28 10:21:24     2011-11-28 10:23:36     Toileting   
2011-11-28 10:25:44     2011-11-28 10:33:00     Showering   
2011-11-28 10:34:23     2011-11-28 10:43:00     Breakfast
等等

前两个字符串由一个空格分隔,然后是两个制表符、一个空格和两个制表符

String fileName = "D:/Tema 5/Activities.txt";

    try (Stream<String> stream = Files.lines(Paths.get(fileName))) {

        list = (ArrayList<String>) stream
                .map(w -> w.split("\t\t")).flatMap(Arrays::stream) 
                .collect(Collectors.toList());

    } catch (IOException e) {

        e.printStackTrace();
    }
String fileName=“D:/Tema 5/Activities.txt”;
try(Stream=Files.line(path.get(fileName))){
列表=(ArrayList)流
.map(w->w.split(“\t\t”)).flatMap(数组::流)
.collect(Collectors.toList());
}捕获(IOE异常){
e、 printStackTrace();
}

您需要引入一个工厂来创建
监控数据
,在示例中,我使用
函数
字符串[]创建
监控数据

Function<String[],MonitoredData> factory = data->{
   DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   try{
     return new MonitoredData(format.parse(data[0]),format.parse(data[1]),data[2]);
     //                       ^--startingTime       ^--finishingTime      ^--label
   }catch(ParseException ex){
     throw new IllegalArgumentException(ex);
   }
};

w.split()
生成一个包含3个字符串的数组。现在您需要
将该数组映射到
监控数据
。要么给
MonitoredData
一个接受数组的构造函数,要么让一个lambda调用该构造函数,或者不要将
collector.toList()的结果强制转换为
ArrayList
。声明的类型是
List
而不是
ArrayList
,这是有原因的。无法保证结果将是一个
ArrayList
。感谢您的帮助@Arkadiy!是的,你说得对。我将使用列表代替@霍尔格
list = stream.map(line -> line.split("\t\t")).map(factory::apply)  
             .collect(Collectors.toCollection(ArrayList::new));