#java #java-8 #java-stream
#java #java-8 #java-stream
Вопрос:
Мне нужно просмотреть два списка, предоставленные мне в качестве входных данных, и я хочу сравнить элементы в обоих списках с одним и тем же индексом и вернуть true, если элемент первого списка всегда больше элемента второго списка.Я мог бы решить проблему с помощью цикла, но с эстетической точки зрения и учитывая читаемость кода, я хочу использовать Java streams.
static boolean validate(List<LocalDate> endDates, List<LocalDate> startDates) {
//check for all elements if the element in first list is greater than elements in second list.
//return false if above condition fails.
Streams.zip(endDate, startDates, (endDate, startDate) -> {..})
}
Комментарии:
1. Привет, Анкит Шарма, спасибо, что присоединились к сообществу и сделали первый шаг. Не могли бы вы сформулировать это как вопрос? В настоящее время кажется, что вы делаете заявление о том, что будете использовать потоки. Чем мы можем вам помочь?
2. Что это
Streams
за класс? Ни один изjava.util.stream
них не имеет методаzip
и не виден вне пакета.3. @ernest_k извините, я использовал некоторую внутреннюю структуру, в которой есть класс Streams util. Да, я говорю о java.util.stream. Есть ли способ, которым я могу выбирать элементы из обоих списков одновременно и сравнивать их?
Ответ №1:
Вы можете использовать Stream.allMatch
сравнение элементов вашего списка один к одному:
static boolean validate(List<LocalDate> endDates, List<LocalDate> startDates) {
return IntStream.range(0, endDates.size())
.allMatch(i -> endDates.get(i).isAfter(startDates.get(i)));
}
Это, конечно, предполагает, что оба списка имеют одинаковую длину (если endDates
короче startDates
, у вас ошибка; если startDates
короче, будет выдано исключение startDates.get(i)
)
Ответ №2:
Текущая реализация Stream API (включая новейшую версию Java 16) не предлагает такого метода, и вам нужно либо использовать стороннюю библиотеку, например StreamEx и метод StreamEx.zip()
, либо использовать java.util.IntStream.range
для достижения того же результата. Однако вы несете ответственность за то, чтобы избежать переполнения индекса.
Минимальный образец:
List<LocalDate> one = Arrays.asList(LocalDate.now(), LocalDate.now(), LocalDate.now());
List<LocalDate> two = Arrays.asList(LocalDate.MIN, LocalDate.MIN);
boolean allAfter = IntStream
.range(0, Math.min(one.size(), two.size())) // limit the indices
.allMatch(index -> one.get(index).isAfter(two.get(index))); // compare the dates