gpt4 book ai didi

Java 8 流、lambda

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:15:00 25 4
gpt4 key购买 nike

我正在尝试学习如何在我的日常编程中利用 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值(value)。

您需要更新您的 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所以它不会改变线。 build 者也很擅长这种事情。

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

关于Java 8 流、lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30482083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com