В одном из заданий курса « Функциональное программирование с Scala» вводится тип, называемый «Terrain» — Terrain представляет регион, части которого доступны, а части — нет. Таким образом, очень умно Terrain определяется следующим образом в задании:
|
1
2
3
|
case class Pos(x:Int, y: Int)type Terrain = Pos => Boolean |
По существу, Terrain — это функция, которая занимает позицию и для этой позиции возвращает логическое значение в зависимости от того, доступна эта позиция или нет!
Учитывая это определение Terrain, способ определить «бесконечный» ландшафт, где каждая позиция доступна, выполняется следующим образом:
|
1
|
val infiniteTerrain = (pos: Pos) => true |
или другой ландшафт, где доступны определенные координаты, можно определить следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
|
def terrainFunction(vector: Vector[Vector[Char]]) : Terrain = { (pos: Pos) => { if (pos.x > vector.size - 1 || pos.y > vector(0).size - 1 || pos.x < 0 || pos.y < 0) { false } else { val ch = vector(pos.x)(pos.y) ch == 'o'; } }} val terrain1 = terrainFunction(Vector( Vector('-','-','-'), Vector('-','o','-'), Vector('-','o','-'), Vector('-','o','-'), Vector('-','-','-') ) ) |
Все очень умно.
Теперь, учитывая, что выпуск Java 8 неизбежен , можно попытаться использовать такой же (почти :-)) умный код, используя конструкции Java 8:
тогда как Terrain может быть определен как сигнатура функции в Scala, он должен быть определен как функциональный интерфейс с Java 8:
|
1
2
3
|
interface Terrain { public boolean isAccessible(Pos pos);} |
Учитывая этот интерфейс, бесконечный ландшафт выглядит следующим образом, используя Lambdas в Java 8:
|
1
|
Terrain infiniteTerrain = (pos) -> true; |
Эквивалент terrainFunction в Java 8 может быть определен следующим образом:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
public Terrain terrainFunction(char[][] arr) { return (pos) -> { if (pos.x > arr.length - 1 || pos.y > arr[0].length - 1 || pos.x < 0 || pos.y < 0) { return false; } else { char ch = arr[pos.x][pos.y]; return ch == 'o'; } };}char[][] arr = { {'-','-','-'}, {'-','o','-'}, {'-','o','-'}, {'-','o','-'}, {'-','-','-'}};Terrain terrain = terrainFunction(arr); assertTrue(terrain.isAccessible(new Pos(1, 1))); |
Достаточно близко!
| Ссылка: | Функциональные интерфейсы Java 8 — случайные размышления, реализующие тип Scala от нашего партнера по JCG Биджу Кунджуммен из блога all and sundry. |