Функциональный способ Java 8 получения последовательных номеров списка

Например, у меня есть список целых чисел, как List(1,2,3,4,5,6,7)

Я хочу получить все комбинации последовательных 3 чисел в Java 8, более функциональный способ изучения Java 8. (я знаю, как это сделать в обязательном порядке)

Таким образом, результатом выше может быть список в виде:

List(List(1,2,3), List(2,3,4), List(3,4,5), List(4,5,6), List(5,6,7))

Спасибо

Может ли список быть случайным? Например: List(6, 7, 4, 3, 2)

Hai Hoang 31.10.2018 07:53
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
4
1
1 042
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать это с помощью List.subList, перебирая его:

final int subListSize = 3;
List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7);
List<List<Integer>> sublists = IntStream.rangeClosed(0, list.size() - subListSize)
            .mapToObj(i -> list.subList(i, i + subListSize))
            .collect(Collectors.toList());

Вы также можете сделать это с помощью библиотеки jOOλ и ее метода Seq.sliding() (Seq - это последовательный Stream):

List<Integer> list = List.of(1, 2, 3, 4, 5, 6, 7);

List<List<Integer>> sublists = Seq.seq(list)
        .sliding(3)
        .map(Collectable::toList)
        .toList();

который дает:

[[1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7]]

Обратите внимание, что:

  • решение нулевого указателя имеет лучшую производительность (новые ArrayList не создаются)
  • мое решение более читабельно (но вы всегда можете извлечь нулевой указатель в такую ​​функцию, как List<List<T>> sublists(List<T> list, int sublistSize)
  • мое решение не зависит от исходного list, в то время как нулевой указатель - это список Просмотры исходного list
    • обычно ни оригинальный list, ни созданный sublists впоследствии не модифицируются, поэтому это не имеет значения (и это хорошо для производительности)
    • однако, если что-либо будет изменено, решение нулевого указателя отразит эти изменения (или даже сломается, если элементы будут удалены из исходного list)
    • чтобы облегчить это, добавьте дополнительный .map(List::copyOf) после mapToObj в его растворе (или .map(ArrayList::new), если вам нужны изменяемые результаты)

Другие вопросы по теме