2017-06-25 23 views
5

Liệu nó tồn tại cách tốt hơn để phân tích String để Integer sử dụng dòng hơn thế này:Java 8 Streams phân tích cú pháp để Integer

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

Bạn có chắc chắn 100% rằng chuỗi đầu vào có chứa những thứ không gian tách ra rằng mỗi thể được phân tích một ' int'? Điều gì nếu một thất bại? Điều gì sẽ xảy ra sau đó? – Jubobs

Trả lời

9

Bạn có thể loại bỏ một bước nếu bạn phân tích các chuỗi trực tiếp đến Integer:

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

Hoặc bạn có thể dính vào loại nguyên thủy, trong đó cung cấp hiệu suất tốt hơn, bằng cách tạo ra một mảng int thay vì một List<Integer>:

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

Bạn cũng có thể thay thế

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

với

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

Tôi không chắc đó là hiệu quả hơn, mặc dù.

3

Có nhiều cách để làm điều đó sẽ có sẵn từ java-9 qua Scanner#findAll:

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

Hi Eugene! Tôi đã thấy bạn đã trả lời ít nhất một câu hỏi tương tự bằng cách sử dụng phương pháp tương tự này. Bạn có thể vui lòng giải thích tại sao bạn cần sử dụng 'map (MatchResult :: group)' trong luồng trả về? Ý tôi là, tôi biết tôi có thể đi đến các tài liệu và tìm hiểu, nhưng có lẽ tốt hơn cho các độc giả tương lai nếu bạn giải thích cách tiếp cận này một chút. Cảm ơn! –

+0

Tôi không nhìn thấy dòng chứa ints được phân tách bằng dấu cách được phân tích cú pháp. Bạn có thể trỏ các máy quét để đọc từ các chuỗi không? – tucuxi

+1

@FedericoPeraltaSchaffner là nhóm được kết hợp đầu tiên trong regex ... với chỉ mục '0'. đó là những gì bạn nhận được khi bạn sử dụng 'group()'. nếu bạn cần một nhóm khác, bạn chỉ cần sử dụng 'nhóm (n)'. Và bạn luôn được chào đón – Eugene

Các vấn đề liên quan