Вот пример метода, который делает то, что вы хотите сделать в первой части вашего вопроса . В основном это потоковое и фильтрует данный List<PT>
, используя только один оператор .filter
:
public class StackoverflowMain {
static class PT {
Integer pn;
// Here, I changed your code. You should really use the up-to-date time API
LocalDate endDate;
String dp;
public PT(int pn, LocalDate endDate, String dp) {
this.pn = pn;
this.endDate = endDate;
this.dp = dp;
}
}
/**
* <p>
* Gets a list of all PTs that match the given criterium for the dp class
* attribute of class PT.
* </p>
*
* @param source the original list that needs to be filtered
* @param dp the dp value to be matched
* @return a list of all PTs that passed the filter criterium
*/
public static List<PT> getPTWithValidEndDateAndDp(List<PT> source, String dp) {
return source.stream()
.filter(pt -> pt.endDate != null && pt.dp.equals(dp))
.collect(Collectors.toList());
}
public static void main(String args[]) {
// mock the list of PTs that you receive from somewhere
List<PT> receivedPTs = new ArrayList<PT>();
// one PT with endDate == null but matching dp
receivedPTs.add(new PT(1, null, "MAR 2019"));
// one PT with valid endDate and valid dp, but no matching dp
receivedPTs.add(
new PT(4, LocalDate.parse("2019-04-11", DateTimeFormatter.ISO_DATE), "APR 2019")
);
// another totally valid PT whose dp does not match
receivedPTs.add(
new PT(6, LocalDate.parse("2019-05-11", DateTimeFormatter.ISO_DATE), "MAY 2019")
);
// a totally valid PT with the matching dp ---> should be contained in the output
receivedPTs.add(
new PT(1, LocalDate.parse("2019-03-11", DateTimeFormatter.ISO_DATE), "MAR 2019")
);
// create a list from the valid and matching PTs passing the source list and the
// dp to be matched
List<PT> marchPTs = getPTWithValidEndDateAndDp(receivedPTs, "MAR 2019");
// output the result
marchPTs.forEach(mpt -> System.out.println("[pn: " + mpt.pn + ", endDate: "
+ mpt.endDate.format(DateTimeFormatter.ISO_DATE) + ", dp: " + mpt.dp + "]"));
}
}
Обратите внимание, что я изменил часть вашего кода, я заменил старомодное и подверженное ошибкам использование java.util.Date
на использование java.time.LocalDate
, которое должно быть предпочтительным в настоящее время.
Не знаю, хватит ли у меня времени, чтобы привести пример для вашего второго требования, но я попробую ...