Переписать, используя потоки Java8 - PullRequest
1 голос
/ 08 мая 2019

Ну, я хотел понять, можно ли переписать код ниже, используя потоки? Если кто-то может объяснить, почему мы можем исключить потоки здесь в первую очередь.

for (int i=0;i<size; i++) {
    int j = i+1;
    while (j<size && Math.abs(arr1[j]-arr1[i])<=k ) {
        if (Math.abs(arr1[j]-arr1[i])==k) {
             cnt++;
        }
        j++;
    }
}

1 Ответ

0 голосов
/ 13 мая 2019

Q: ... понять, можно ли переписать ...

Да, это возможно, но сильно обескуражен. Пожалуйста, примите это к сведению и помните, что не является заменой 1: 1 для в большинстве случаев.

В: ... почему мы можем исключить потоки здесь с самого начала ...

Потоки вообще не подходят для повторного использования индексов или их повторного использования. Идея Stream является монадой и подходит для обхода коллекции / массива один раз и получения объявленного вывода.

Существует способ использования IntStream::range в качестве замены для итерации по массиву с использованием индексов, однако это дает нереальное преимущество для решения и, кроме того, значительно более многословный и менее ясный. Кроме того, я не могу представить себе решение, которое в принципе не нарушает ключевые принципы Streams :

  • Невмешательство
  • поведение без гражданства
  • Без побочных эффектов

Типичные сценарии использования для - это фильтрация, выравнивание / отображение, редукция, сбор в коллекцию или группирование в Map с использованием или без использования операций агрегации и т. Д ... Они также подходят для параллельной обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...