Есть ли лучший функциональный тип интерфейса для хранения этого выражения лямбда? И есть ли чистый способ заменить петли потоками? Ищете способ сделать это с более выразительным кодом.Как вы производите произвольное выражение лямбда в Java 8?
Проблема заключается в анализе 2D-сетки (сетки) и сохранении результатов в простом классе значений (результаты). Нужно идти вверх, вниз, влево и прямо вдоль сетки, начиная с заданной точки (строка, col). Каждый из четырех циклов, которые нужно пройти, содержит точный код, явное нарушение DRY.
Мое решение состоит в том, чтобы написать четыре петли и вызвать метод в каждом. Это метод throwaway, поэтому я использовал лямбду Java 8 с доступом к сеткам результатов &, потому что они в лексической области.
Predicate<int[]> countAndBreak = (int[] coord) -> {
int r = coord[0];
int c = coord[1];
if (grid[r][c] == Grid.YUMMYCANDY)
results.count++;
if (grid[r][c] == Grid.WALL)
return true;
else
return false;
};
for (int r = row; r < grid.length; r++) {
if (countAndBreak.test(new int[] { r, col }))
break;
}
for (int r = row; r >= 0; r--) {
if (countAndBreak.test(new int[] { r, col }))
break;
}
for (int c = col; c < grid[0].length; c++) {
if (countAndBreak.test(new int[] { row, c }))
break;
}
for (int c = col; c >= 0; c--) {
if (countAndBreak.test(new int[] { row, c }))
break;
}
Не уверен в этом решении, но я знаю, что такая логика станет намного проще с «takeWhile» Java 9. – Zircon
Поскольку это то, что принимает один параметр и возвращает 'boolean',' Predicate' является подходящим функциональным интерфейсом для использования. Вы можете написать 'if (grid [r] [c] == Grid.WALL) return true; else return false; 'просто как' return grid [r] [c] == Grid.WALL; ' – Jesper
Отличная уловка по булевому, @Jesper. Обратите внимание, что единственная причина, по которой этот предикат принимает один параметр, заключается в том, что я перепутал два параметра в один, используя массив, временный кортеж для Java. – MikeJfromVA