2016-10-20 2 views
1

나는 파일을 읽고 정수 목록을 구성합니다.문자열 목록에서 비 정수 필터링

예제 파일 : 아래의 코드를 실행에

1 1 2 3 4 
2 2 5 abc 

4 2 8 

이 때문에 "ABC"정수로 변환 할 수 없습니다 실패합니다.

Java 8에서 비 정수 필드를 더 깨끗하게 필터링 할 수 있는지 알려주십시오. 예 : 필터 사용?

try (BufferedReader br = new BufferedReader(new InputStreamReader(
     new FileInputStream(file)))) { 

    List<Integer> allValues = new ArrayList<>();  
     br.lines().forEach(
      strLine -> { 
      List<String> wordsList = Arrays.asList(strLine.trim().split(" ")); 
      List<Integer> routes = wordsList.stream() 
       .filter(e -> e != null && !e.isEmpty()) 
       .map(Integer::valueOf) 
       .collect(Collectors.toList()); 
      allValues.addAll(routes); 
      }); 

     allValues.forEach(str -> System.out.print(str)); 
    } 

답변

3
  • 당신은 라인의 스트림을 얻기 위해 FileInputStream>InputStreamReader>BufferedReader 우회 필요하지 않습니다. BufferedReader이 필요한 경우에도 Files.newBufferedReader

  • forEach 내에서 기존 컬렉션을 조작하지 마십시오. 만약 당신이 그걸 잊어 버리면 평범한 고리를 유지하는 것이 낫다. Stream의 경우 중첩 된 항목을 처리하기 위해 flatMap이 있습니다 (예 : 선

  • 자체는 간단한 정규 표현식으로 필터링 할 수 있습니다 토큰 내에서 토큰은, [0-9]+는 적어도 하나의도 빈 문자열을 정렬 자리,하지만 분할 패턴보다는 " "" *"를 사용하여, 빈이 있어야한다는 것을 의미 문자열은 처음부터 만들어지지 않습니다. null는 ... 분할 작업

의 결과로 발생하지

List<Integer> allValues; 
try(Stream<String> lines=Files.lines(file.toPath())) { 
    allValues=lines.flatMap(Pattern.compile(" *")::splitAsStream) 
     .filter(s -> s.matches("[0-9]+")) 
     .map(Integer::valueOf) 
     .collect(Collectors.toList()); 
}