일반적인 루프로 자동 변환되는 Stream API 체인, Iterable.forEach()Map.forEach() 호출을 보고합니다. 이 검사는 이전 Java 버전과의 하위 호환성을 위해 다운그레이드하는 데 도움이 될 수 있습니다.

예:


  String joinNonEmpty(List<String> list) {
    return list.stream() // 스트림을 루프로 변환할 수 있습니다
      .filter(s -> !s.isEmpty())
      .map(String::trim)
      .collect(Collectors.joining(", "));
  }

빠른 수정을 적용한 후:


  String joinNonEmpty(List<String> list) {
    StringJoiner joiner = new StringJoiner(", ");
    for (String s : list) {
      if (!s.isEmpty()) {
        String trim = s.trim();
        joiner.add(trim);
      }
    }
    return joiner.toString();
  }

때때로 이 검사로 인해 약간의 의미 변경이 있을 수 있습니다. 스트림이 쇼트 서킷될 때 실제로 얼마나 많은 요소를 읽을 지 지정되지 않았으므로 쇼트 서킷과 관련하여 특별한 주의를 기울여야 합니다.

검사 구성:

인식되지 않은 소스를 사용하는 스트림에 대한 변환을 제안하려면 Stream.iterator()를 통해 알 수 없는 Stream 소스 반복 옵션을 사용하세요. 이 경우 반복자는 스트림으로부터 생성됩니다. 예를 들어, 체크박스가 선택되면, 제안된 변환이 여기에 표시됩니다:


  List<ProcessHandle> handles = ProcessHandle.allProcesses().collect(Collectors.toList());

이 경우 결과는 다음과 같습니다:


  List<ProcessHandle> handles = new ArrayList<>();
  for (Iterator<ProcessHandle> it = ProcessHandle.allProcesses().iterator(); it.hasNext(); ) {
    ProcessHandle allProcess = it.next();
    handles.add(allProcess);
  }

2017.1의 새로운 기능