Найдите элемент с потоком Java, если его нет, выберите другой

#java #java-stream

#java #java-stream

Вопрос:

Я новичок в Java stream,

У меня есть список данных, который имеет некоторый приоритет, он выглядит следующим образом

 triggerFilterList =  [{"id":"1","name":"xyz":"rank":"1","priority":"A-1"},
{"id":"1","name":"xyz":"rank":"1","priority":"A-2"},
{"id":"1","name":"xyz":"rank":"1","priority":"A-3"},
{"id":"1","name":"xyz":"rank":"2","priority":"NA"}]
  

В настоящее время это то, что я сделал, в этом сценарии я получаю только первый элемент

 TriggerEntity triggerEntity = triggerFilterList.stream()
    .filter(triggerData -> triggerData.getRank().equalsIgnoreCase(RankCategoryModel.getRank())
    .findFirst().orElse(null);
  

Мне нужно получить данные, которые имеют приоритет 1, если ранг равен 1, если приоритет 1 отсутствует, тогда получите данные приоритета 2, если приоритет 2 отсутствует, тогда получите данные приоритета 3,
В некоторых случаях приоритет будет недоступен.

В этом triggerEntity мне нужен приоритет данных

Комментарии:

1. Итак, вы хотите отсортировать поток.

2. нет, если доступен приоритет 1, то мне нужна только эта строка {"id":"1","name":"xyz":"rank":"1","priority":"1"} если доступен приоритет 2, то мне нужна только эта строка {"id":"1","name":"xyz":"rank":"1","priority":"2"}

3. И вы достигнете этого путем сортировки потока, после чего первым элементом будет тот, который вы хотите.

4. Вы должны отсортировать, взять первую запись из результата и выполнить цикл по списку до приоритета <> предыдущий приоритет.

5. Если возможны значения (1, 2,…. NA), вы можете достичь этого, сравнив лексикографически: triggerFilterList.stream().min(Comparator.comparing(TriggerEntity::getRank)).orElse(null);

Ответ №1:

Я не уверен, что это то, что вы хотите, но когда я читаю ваше объяснение, звучит примерно так;

 triggerFilterList.stream()
            .reduce( (trigerredData1, trigerredData2) ->
                trigerredData1.rank.equals(trigerredData1.priority) ? trigerredData1 : trigerredData2);