2017-06-25 51 views
5

是否存在更好的方法來解析字符串中使用流比這個整數的Java 8流解析爲整數

String line = "1 2 3 4 5"; 
List<Integer> elements = Arrays.stream(line.split(" ")).mapToInt(x -> Integer.parseInt(x)) 
    .boxed().collect(Collectors.toList()); 
+0

你100%確保輸入的字符串包含空格分開的東西,可以每個被解析到一個' int'?如果失敗會怎樣?那麼應該發生什麼? – Jubobs

回答

9

可以消除一個步驟,如果你直接解析字符串爲整數:

String line = "1 2 3 4 5"; 
List<Integer> elements = Arrays.stream(line.split(" ")).map(Integer::valueOf) 
    .collect(Collectors.toList()); 

或者你可以堅持的基本類型,它提供更好的性能,通過創建一個int陣列,而不是一個List<Integer>

int[] elements = Arrays.stream(line.split(" ")).mapToInt(Integer::parseInt).toArray(); 

您還可以

Pattern.compile(" ").splitAsStream(line) 

更換

Arrays.stream(line.split(" ")) 

我不知道哪個更有效,雖然。

3

有做一個更多的方式,將可由於Java-9通過Scanner#findAll

int[] result = scan.findAll(Pattern.compile("\\d+")) 
        .map(MatchResult::group) 
        .mapToInt(Integer::parseInt) 
        .toArray(); 
+0

嗨尤金!我已經看到你用這種方法至少回答了一個類似的問題。你能不能請解釋爲什麼你需要在返回的流中使用'map(MatchResult :: group)'?我的意思是,我知道我可以找到文檔並找出來,但如果你稍微解釋一下這個方法,對未來的讀者來說可能會更好。謝謝! –

+0

我無法看到包含空格分隔整數的行在哪裏被解析。你能指出掃描儀從字符串中讀取嗎? – tucuxi

+1

@FedericoPeraltaSchaffner它是正則表達式中第一個匹配的組...,索引爲'0'。這就是你使用group()時得到的結果。如果你需要另一個組,你可以使用'group(n)'。總是歡迎你 – Eugene