如何简单地使用流API编写代码

时间:2019-05-07 15:34:28

标签: java java-stream

我有以下课程:

@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 个答案:

答案 0 :(得分:1)

如果我正确理解您的问题,则可以将后两个功能恢复为以下功能:

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());

我大部分时间都把您的代码重新整理到一个过滤器中。