【发布时间】:2015-05-27 12:12:51
【问题描述】:
我正在尝试学习如何在我的日常编程中使用 Java 8 功能(例如 lambda 和流),因为它可以使代码更加简洁。
这是我目前正在做的事情: 我从本地文件中获取了一个字符串流,其中包含一些数据,稍后我将其转换为对象。输入文件结构如下所示:
Airport name; Country; Continent; some number;
我的代码如下所示:
public class AirportConsumer implements AirportAPI {
List<Airport> airports = new ArrayList<Airport>();
@Override
public Stream<Airport> getAirports() {
Stream<String> stream = null;
try {
stream = Files.lines(Paths.get("resources/planes.txt"));
stream.forEach(line -> createAirport(line));
} catch (IOException e) {
e.printStackTrace();
}
return airports.stream();
}
public void createAirport(String line) {
String airport, country, continent;
int length;
airport = line.substring(0, line.indexOf(';')).trim();
line = line.replace(airport + ";", "");
country = line.substring(0,line.indexOf(';')).trim();
line = line.replace(country + ";", "");
continent = line.substring(0,line.indexOf(';')).trim();
line = line.replace(continent + ";", "");
length = Integer.parseInt(line.substring(0,line.indexOf(';')).trim());
airports.add(new Airport(airport, country, continent, length));
}
}
在我的主类中,我遍历对象流并打印出结果:
public class Main {
public void toString(Airport t){
System.out.println(t.getName() + " " + t.getContinent());
}
public static void main(String[] args) throws IOException {
Main m = new Main();
m.whatever();
}
private void whatever() throws IOException {
AirportAPI k = new AirportConsumer();
Stream<Airport> s;
s = k.getAirports();
s.forEach(this::toString);
}
}
我的问题是:如何优化这段代码,这样我就不必单独解析文件中的行,而是直接从源文件创建一个对象流 Airport?或者这就是我可以做到的程度?
【问题讨论】:
-
注意:你应该关闭文件:
try(Stream<String> lines = Files.lines(...)) { lines.map(xxx).collect(...) };
标签: java lambda java-8 java-stream