従来のループに自動的に変換できる 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() を介して不明なストリームソースを繰り返す」オプションを使用します。 この場合、イテレーターがストリームから作成されます。 たとえば、ここではチェックボックスが選択されている場合に変換が提案されます。


  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 の新機能です