Когда вы запрашиваете "лямбда-функцию для выполнения sh этого" , я полагаю, что вы на самом деле спрашиваете, как это сделать, используя потоков .
Я предполагаю, что Tuple
- это отдельный класс верхнего уровня или static
вложенный класс, а не внутренний класс, как это в настоящее время показано в вопросе.
List<Tuple> tuples = processes.stream()
.flatMap(p0 -> processes.stream()
.filter(p1 -> p0.getPid() != p1.getPid()
&& p0.getProcessName().equals(p1.getProcessName()))
.map(p1 -> new Tuple(p0, p1)))
.collect(Collectors.toList());
Однако для лучшей производительности я бы предложил сделать это следующим образом:
List<Tuple> tuples2 = processes.stream()
.collect(Collectors.groupingBy(Process::getProcessName))
.values().stream()
.filter(list -> list.size() > 1)
.flatMap(list -> list.stream()
.flatMap(p0 -> list.stream()
.filter(p1 -> p0.getPid() != p1.getPid())
.map(p1 -> new Tuple(p0, p1))
)
)
.collect(Collectors.toList());
Я надеюсь, вы понимаете, что все кортежи будут иметь зеркала, т.е. для каждого tuple(a,b)
, который вы собираетесь также иметь tuple(b,a)
. Чтобы предотвратить это, измените условия p0.getPid() != p1.getPid()
на p0.getPid() < p1.getPid()
.