我试图学习如何在日常编程中利用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?或者这是我可以做到的程度?
您需要使用map()
它来转换过去的数据。
Files.lines(Paths.get("resources/planes.txt"))
.map(line -> createAirport(line));
这将返回Stream<Airport>
-如果要返回List
,则需要collect
在最后使用该方法。
这种方法也是无状态的,这意味着您不需要实例级别的airports
值。
您需要更新createAirport方法以返回一些内容:
public Airport createAirport(String line) {
String airport = line.substring(0, line.indexOf(';')).trim();
line = line.replace(airport + ";", "");
String country = line.substring(0,line.indexOf(';')).trim();
line = line.replace(country + ";", "");
String continent = line.substring(0,line.indexOf(';')).trim();
line = line.replace(continent + ";", "");
int length = Integer.parseInt(line.substring(0,line.indexOf(';')).trim());
return new Airport(airport, country, continent, length);
}
如果您正在寻找一种对代码更具功能性的方法,则可能需要考虑对其进行重写,createAirport
以使其不会改变行。建筑商也很喜欢这种事情。
public Airport createAirport(final String line) {
final String[] fields = line.split(";");
return new Airport(fields[0].trim(),
fields[1].trim(),
fields[2].trim(),
Integer.parseInt(fields[3].trim()));
}
放在一起,您的课程现在看起来像这样。
public class AirportConsumer implements AirportAPI {
@Override
public Stream<Airport> getAirports() {
Stream<String> stream = null;
try {
stream = Files.lines(Paths.get("resources/planes.txt"))
.map(line -> createAirport(line));
} catch (IOException e) {
stream = Stream.empty();
e.printStackTrace();
}
return stream;
}
private Airport createAirport(final String line) {
final String[] fields = line.split(";");
return new Airport(fields[0].trim(),
fields[1].trim(),
fields[2].trim(),
Integer.parseInt(fields[3].trim()));
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句