ストリームでのプロセスのフィルタリング

ProcessHandle.allProcessesメソッドでは、現在のプロセスで参照可能なすべてのプロセスのストリームが返されます。コレクションから要素をフィルタするのと同じ方法を使用して、このストリームのProcessHandleインスタンスをフィルタできます。

次の引用では、filterProcessesTestメソッドによって、現在のユーザーが所有しているすべてのプロセスに関する情報が、親プロセスのプロセスIDでソートされて出力されます。

public class ProcessTest {

  // ...

  public static void main(String[] args) {
    ProcessTest.filterProcessesTest();
  }

  static void filterProcessesTest() {
    Optional<String> currUser = ProcessHandle.current().info().user();
    ProcessHandle.allProcesses()
        .filter(p1 -> p1.info().user().equals(currUser))
        .sorted(ProcessTest::parentComparator)
        .forEach(ProcessTest::showProcess);
  }

  static int parentComparator(ProcessHandle p1, ProcessHandle p2) {
    long pid1 = p1.parent().map(ph -> ph.pid()).orElse(-1L);
    long pid2 = p2.parent().map(ph -> ph.pid()).orElse(-1L);
    return Long.compare(pid1, pid2);
  }

  static void showProcess(ProcessHandle ph) {
    ProcessHandle.Info info = ph.info();
    System.out.printf("pid: %d, user: %s, cmd: %s%n",
      ph.pid(), info.user().orElse("none"), info.command().orElse("none"));
  } 

  // ...
}

allProcessesメソッドはネイティブ・オペレーティング・システムのアクセス制御によって制限されることに注意してください。また、すべてのプロセスは非同期に作成され終了するため、ストリーム内のプロセスがアライブであること、またはallProcessesメソッドをコールした後に他のプロセスが作成されていないことは保証されません。