Использование Streams.zip способ одновременного использования двух потоков для объектов LocalDate

#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