Создайте один метод, использующий лямбду для печати с разными условиями java

#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 … или, что еще лучше, убедитесь, что правильные объекты переданы, или используйте другую и более гибкую структуру данных.