私は、Java Order
クラスにいくつかの注文ページファイル(HTML)を抽出しています、と私は以下のコードに来た:(私は非常に長く、冗長であると考えている私の質問は、その部分を書き換える方法ですJava:String配列をインデックス0から-2にエレガントな方法で連結する方法は?
List<Order> orders = Files.walk(Paths.get(path, "orders", "html"))
.map(Path::toFile)
.map(this::readFileToString)
.map(content -> {
Order order = new Order();
evaluateXPath("//*[@id='page']/div[2]/div[1]/div[3]/div[2]/span[2]/text()", content)
.ifPresent(x -> {
String[] results = x.split(" ");
if (results.length >= 3) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < results.length - 2; i++) {
stringBuilder.append(results[i]);
}
order.setConsignee(stringBuilder.toString());
order.setPhoneNumber(results[results.length - 2]);
order.setAddress(results[results.length - 1]);
}
});
return order;
}).collect(Collectors.toList());
//a exception free wrapper method for FileUtils.readFileToString
private String readFileToString(File file) {
try {
return FileUtils.readFileToString(file);
} catch (IOException e) {
LOGGER.error("read " + file + " failed.");
return "";
}
}
private Optional<String> evaluateXPath(String xpath, String content) {
//a mysterious implementation of evaluateXPath
}
)よりうまく実装するには?
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < results.length - 2; i++) {
stringBuilder.append(results[i]);
}
order.setConsignee(stringBuilder.toString());
私のコードの他の部分についても、アドバイスは大歓迎です。
これは本当にだけで結構です。 'IntStream.range(0、results.length - 1).mapToObj(i - > results [i])。collect(join(" "));" neater "? 'String.join(" "、Arrays.asList(results).subList(0、results.length - 1))'、 "neater"ですか? – Tunaki
しかし、 'joined'に' '"を指定する必要はありません。 ['joined()'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#joining--)も同じことをする必要があります。 – fabian