Java 8 функциональный способ получения последовательных номеров списка - PullRequest
0 голосов
/ 31 октября 2018

Например, у меня есть список целых чисел, как 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))

Спасибо

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы также можете сделать это, используя библиотеку 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]]

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

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

Вы можете сделать это, используя 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());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...