Сортировка
Отсортируем массив чисел в параллельном режиме:
int[] nums = {30, -4, 5, 29, 7, -8};
Arrays.parallelSort(nums);
for(int i: nums)
System.out.println(i);
Метод Arrays.parallelSort() в качестве параметра принимает
массив и сортирует его по
возрастанию:
-8
-4
5
7
29
30
Если же нам надо как-то по-другому отсортировать объекты, например, по
модулю числа,
или у нас более сложные объекты, то мы можем создать свой компаратор и передать его в
качестве второго параметра в Arrays.parallelSort().
Например, возьмем выше определенный класс
Phone и создадим для него компаратор:
import java.util.Arrays;
import java.util.Comparator;
public class StreamApp {
public static void main(String[] args) {
Phone[] phones = new Phone[]{new Phone("iPhone 6 S", 54000),
new Phone("Lumia 950", 45000),
new Phone("Samsung Galaxy S 6", 40000),
new Phone("LG G 4", 32000)};
Arrays.parallelSort(phones,new PhoneComparator());
for(Phone p: phones)
System.out.println(p.getName());
}
}
class PhoneComparator implements Comparator
{
public int compare(Phone a, Phone b){
return a.getName().toUpperCase().compareTo(b.getName().toUpperCase());
}
}
Метод parallelPrefix
Метод parallelPrefix()
походит для тех случаев, когда надо получить элемент массива или
объект того же типа,
что и элементы массива, который обладает некоторыми признаками.
Например, в массиве чисел это может быть максимальное, минимальное значения и т.д.
Например, найдем произведение чисел:
int[] numbers = {1, 2, 3, 4, 5, 6};
Arrays.parallelPrefix(numbers, (x, y) -> x * y);
for(int i: numbers)
System.out.println(i);
Мы получим следующий результат:
1
2
6
24
120
720
То есть, как мы видим из консольного вывода, лямбда-выражение из Arrays.parallelPrefix,
которое
представляет бинарную функцию, получает два элемента и выполняет над ними
операцию. Результат операции сохраняется и передается в следующий вызов бинарной функции.
Рассмотрим более сложный пример: у нас есть массив объектов Phone, и
нам надо найти в
массиве смартфон с минимальной ценой:
Phone[] phones = new Phone[]{
new Phone("Samsung Galaxy S 6", 40000),
new Phone("Lumia 950", 45000),
new Phone("LG G 4", 32000),
new Phone("iPhone 6 S", 54000)
};
Arrays.parallelPrefix(phones, (p1, p2)->{
if(p1.getPrice()> p2.getPrice()) return p2;
else return p1;
});
for(Phone p: phones)
System.out.println(p.getPrice());
В лямбда-выражении два смартфона сравниваются по цене, и в качестве результата
возвращается смартфон с минимальной ценой. Опять же промежуточный
результат в виде
смартфона с минимальной ценой сохраняется и сравнивается с последующим элементом
массива. В итоге программа выведет нам следующий результат:
Samsung Galaxy S 6 - 40000
Samsung Galaxy S 6 - 40000
LG G 4 - 32000
LG G 4 - 32000
То есть при сравнении первого и второго смартфона будет возвращаться первый смартфон в
силу меньшей цены. Затем результат первого сравнения (первый смартфон)
сравнивается с
третьим смартфоном и так далее.