2017-06-23 12 views
1

Streamを使用してこの行のすべての整数の合計を求めるにはどうすればよいですか?Java 8ストリームは文字列の合計をとる

String line = "Test 15 lqlq 35 bad 99999 guess 34"; 

List<String> lineSplitted = Arrays.stream(line.split(" ")).collect(Collectors.toList()); 
int result = 0; 
try { 
    result = lineSplitted.stream().filter(s -> Integer.parseInt(s)).sum(); 
} 
catch (Exception e) { 

} 
System.out.println(result); 
+2

あなたはあなたがする必要がある機能を知っていますでしょうか?フィルタ、マップ、削減、収集などと同じですか? – Jason

答えて

6

はここで働い例です。あなたはここでそれをオンラインで試すことができます。http://www.tutorialspoint.com/compile_java8_online.php?PID=0Bw_CjBb95KQMMmVYcHlGWkpmdkE

あなたは、基本的に必要があります。

  1. は、アレイ
  2. に文字列を変換する非数字を除外する
  3. 数タイプに数文字列に変換し
  4. 合計それら

実例:

import java.util.*; 
import java.util.stream.*; 

public class HelloWorld { 

    public static void main(String[] args){ 

     String line = "Test 15 lqlq 35 bad 99999 guess 34"; 

     int sum = Arrays 
      .stream(line.split(" ")) // Convert to an array 
      .filter((s) -> s.matches("\\d+")) // Only select the numbers 
      .mapToInt(Integer::parseInt) // Convert to Integers 
      .sum(); // Sum 

     System.out.println(sum); 
    } 
} 
+1

これまでのところ最高です:) – meskobalazs

+3

各部分文字列のパターンを再コンパイルしないようにするには、 'Pattern.compile(" \\ d + ")。asPredicate()'を使用する必要があります。 –

5

どのようにすべての非数字で結果を分割について:

long sum = Pattern.compile("\\D+").splitAsStream(line) 
        .filter(s -> !s.isEmpty()) 
        .mapToLong(Long::parseLong).sum() 
3

ありもう一つの方法だが、JDK-9が必要です。Scanner.findAll()

String line = "Test 15 lqlq 35 bad 99999 guess 34"; 
Scanner scanner = new Scanner(line); 
long result = scanner.findAll(Pattern.compile("\\d+")) 
      .map(MatchResult::group)).mapToLong(Long::parseLong).sum(); 
System.out.println(result); 
関連する問題