Обход базового связанного списка с использованием Java 8 Lambda и Streams - PullRequest
0 голосов
/ 10 мая 2019

Есть ли способ пройти через базовый связанный список, используя лямбду Java 8? Позволяет, если ниже подпись узла

public class ListNode {
  int val;
  ListNode next;
  ListNode(int x) { val = x; }
}

и это мои тестовые данные:

    ListNode node1 = new ListNode(90);
    node1.next = new ListNode(200);
    node1.next.next = new ListNode(300);
    node1.next.next.next = new ListNode(400);

Можно ли пройти через лямбда / поток Java 8?

Спасибо!

Ответы [ 2 ]

2 голосов
/ 10 мая 2019

Во-первых, обратите внимание, что класс LinkedList уже доступен в JDK и напрямую предоставляет метод .stream(). Я рекомендовал бы использовать эту стандартную реализацию, если это возможно.

Если вы все еще хотите использовать свой пользовательский класс ListNode, хороший способ получить поток из него:

  1. сделать ListNode реализовать java.lang.Iterable интерфейс,
  2. Звоните StreamSupport.stream(listNodeInstance.spliterator(), false)
1 голос
/ 10 мая 2019

в Java 8 у нас есть только Stream::iterate с 2 аргументами: начальный элемент и функция для создания нового элемента из предыдущего, но вы должны сделать этот поток конечным, и один из способов сделать это - использовать Stream::limit и передав размер связанного списка (который вы должны иметь даже в базовой реализации):

Stream.iterate(node1, ListNode::getNext)
      .limit(4) //linked list size
      .forEach(n -> {
          System.out.println(n.val);
      });
...