Как написать код просто используя потоковый API - PullRequest
0 голосов

У меня есть следующие классы:

@Getter
public class SomeClass implements Serializable {
    private LocalDate date;
    private String smth;
    List<PairKeyValue> quotaParams;
}

Класс PairKeyValue просто:

@Getter
public class PairKeyValue implements Serializable {

    private String key;
    private String value;
}

Я хочу сделать следующее:

1) Проверить, еслив SomeClass's дата равна sysdate, затем проверьте значение в key="somekey", в list<PairKeyValue> равно 1 (somekey = 1) и оставьте его в списке.

2) Проверьте, есть ли в SomeClass's dateНЕ равно sysdate, затем проверьте значение в key="somekey" в List<PairKeyValue> равно 0 (somekey = 0), затем оставьте его в списке.

3) И игнорируйте другие значения.

Итак, в конце мне нужен отфильтрованный список только текущих значений в пределах SomeClass.

У меня есть понимание, но мне не нравится, что он не использует только потоковый API:

availableQuotes =ArrayList ();

 if (CollectionUtils.isNotEmpty(availableQuotes)) {
        availableQuotes = availableQuotes
                .stream()
                .filter(this::checkDate).collect(toList());
    }

    private boolean checkDate (SomeClass someClass){
        if (someClass.getDate().equals(LocalDate.now())) {
            return checkDuration(someClass, "0");
        } else {
            return checkDuration(someClass, "1");
        }
    }

    private boolean checkDuration (SomeClass someClass, String param){
        List<PairKeyValue> quotaParams = someClass.getPairKeyValues().stream()
                .filter(spKeyValue -> spKeyValue.getKey().equals("duration"))
                .filter(spKeyValue -> spKeyValue.getValue().equals(param))
                .collect(toList());
        return (CollectionUtils.isNotEmpty(quotaParams));
    }

Я знаю, что это выглядит ужасно, и я знаю, что это может быть более читабельным, поэтому, пожалуйста, помогите.

1 Ответ

1 голос
/ 07 мая 2019

Если я правильно понял ваш вопрос, последние 2 функции можно возобновить следующим образом:

availableQuotes = availableQuotes.stream()
            .filter(availableQuote -> availableQuote.getQuotaParams().stream()
                    .anyMatch(quotaParam -> quotaParam.getKey().equals("duration")
                            && quotaParam.getValue().equals(availableQuote.getDate().equals(LocalDate.now()) ? "0" : "1")))
            .collect(Collectors.toList());

Я в основном взял ваш код и перестроил его в один фильтр.

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