Filtering Processes with Streams
The method ProcessHandle.allProcesses returns a stream of all processes visible to the current process. You can filter the ProcessHandle instances of this stream the same way that you filter elements from a collection.
In the following excerpt, the method filterProcessesTest
prints information about all the processes owned by the current user, sorted by the process ID of their parent's process:
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"));
}
// ...
}
Note that the allProcesses method is limited by native operating system access controls. Also, because all processes are created and terminated asynchronously, there is no guarantee that a process in the stream is alive or that no other processes may have been created since the call to the allProcesses method.