#java #lambda
#java #лямбда — выражение
Вопрос:
Итак, у меня есть этот код:
ArrayList<Meeting>[] calendary = new ArrayList[31];
public class Meeting{
private LocalTime startTime;
private LocalTime endTime;
private String describtion;
private final static LocalTime YEARLY_START_POINT = LocalTime.of(5, 0);
private String priority;
private boolean status;
}
И задача состоит в том, чтобы сделать один метод, использующий лямбду, для печати элементов из массива «calendary», но я не знаю, как этого добиться.
Предполагается, что нужно делать что-то вроде печати собраний из календаря, где status==true, или печатать все элементы
, где describtion == «sth». И мы передаем условие в метод parametr
Комментарии:
1. «создайте один лямбда-метод», судя по остальной части вашего вопроса, вы уверены, что не имеете в виду «создать один метод, использующий лямбда / предикат»? Похоже, вам нужен метод, который печатает все совпадающие элементы, и «сопоставление» — это то, что вы можете передать.
2. ваш код — это java-код, а не c #, поэтому, пожалуйста, измените тег или измените код
3. Вы можете динамически указывать предикаты. См. Раздел «Для фильтрации с помощью оператора switch» в docs.microsoft.com/en-us/dotnet/csharp/linq /…
Ответ №1:
Попробуйте так:
ArrayList<Meeting>[] calendarys = new ArrayList[31];
List<Meeting> meet = new ArrayList<>();
List<Meeting> sth = new ArrayList<>();
Arrays.stream(calendarys).map(calendary -> {
if (calendary.getStatus()) {
meet.add(calendary); //collect meetings
} else if (calendary.getDescription().equals("sth") {
sth.add(calendary); //collect all describtion == "sth"
}
return null;
});
Комментарии:
1. Сравнение строк с
==
, тьфу!equals
, илиequalsIgnoreCase
используются для этого.
Ответ №2:
Прежде всего, вы уверены в этой структуре? Массив списков не очень хорош.
Вы можете легко добиться этого, передав multiple Predicate<Meeting>
в метод, который будет фильтровать значения для вас.
private static List<Meeting>[] filtered(List<Meeting>[] list, Predicate<Meeting>... predicates) {
// No predicates, no filter
if (predicates == null || predicates.length == 0) {
return list;
}
// Build one Predicate from others
Predicate<Meeting> predicate = Arrays.stream(predicates)
.reduce(Predicate::and)
.orElse(p -> true);
// Filter the meetings and return in the original data structure
return Arrays.stream(list)
.map(meetingList -> meetingList == null ? null :
meetingList.stream()
.filter(predicate)
.collect(Collectors.toList()))
.toArray(List[]::new);
}
Просто помните, что код завершится ошибкой, когда a null
произойдет в том месте List
, где должен появиться экземпляр типа of . По этой причине используйте тернарный оператор для null
немедленного возврата списка вместо того, чтобы пытаться выполнить потоковую передачу по нему, что приведет к попаданию в NPE … или, что еще лучше, убедитесь, что правильные объекты переданы, или используйте другую и более гибкую структуру данных.