2016-03-29 3 views
1

私は、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()); 

私のコードの他の部分についても、アドバイスは大歓迎です。

+4

これは本当にだけで結構です。 '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

+0

しかし、 'joined'に' '"を指定する必要はありません。 ['joined()'](https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#joining--)も同じことをする必要があります。 – fabian

答えて

3
Stream.of(results).limit(results.length-2).collect(Collectors.joining()) 
1

あなたはそれを好転させることができます:

if (results.length >= 3) { 
    Deque<String> resultList = new ArrayDeque<>(Arrays.asList(results)); 
    order.setAddress(resultList.removeLast()); 
    order.setPhoneNumber(resultList.removeLast()); 
    order.setConsignee(String.join("", resultList)); 
} 
+0

別のいい解決策、ありがとう! – Sayakiss

関連する問題