我有以下课程:
@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));
}
我知道它看起来糟透了,而且它可读性更好,所以请帮忙。
答案 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());
我大部分时间都把您的代码重新整理到一个过滤器中。