Streamのlist链表转换

简介: Streamのlist链表转换

如果人生有也能有第二版,我将会如何认真地修改校对!——克莱尔

直接上代码!

package com.ruben;/**
 * @ClassName: ListNodeDemo
 * @Date: 2020/11/21 0021 00:06
 * @Description:
 */
import java.util.Comparator;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
 * @ClassName: ListNodeDemo
 * @Description: 我还没有写描述
 * @Date: 2020/11/21 0021 0:06
 * *
 * @author: <achao1441470436@gmail.com>
 * @version: 1.0
 * @since: JDK 1.8
 */
public class ListNodeDemo {
    public static void main(String[] args) {
        // 创建链表
        ListNode zero = new ListNode(0);
        ListNode one = new ListNode(1);
        ListNode two = new ListNode(2);
        ListNode three = new ListNode(3);
        two.next = three;
        one.next = two;
        zero.next = one;
        // 获取链表长度,为什么要获取链表长度呢?因为下面使用的无限流,在jdk8的时候是没法通过条件判断停止,所以这里使用limit去截取,jdk9的时候就可以不用下面的获取长度操作了
        ListNode tmp = zero;
        AtomicInteger length = new AtomicInteger();
        while (tmp != null) {
            length.getAndIncrement();
            tmp = tmp.next;
        }
        // 链表转换成List<Integer>
        List<Integer> integerList = Stream.iterate(zero, l -> l.next).limit(length.get()).mapToInt(l -> l.val).boxed().collect(Collectors.toList());
        // 链表转换成int[]
        int[] ints = Stream.iterate(zero, l -> l.next).limit(length.get()).mapToInt(l -> l.val).toArray();
        // List<Integer>转换成链表
        ListNode listNode = integerList.stream()
                // 可以在这里进行倒序排序,以证明我们确实转换成功
                .sorted(Comparator.reverseOrder())
                .collect(() -> new ListNode(0), (listNode1, integer) -> {
                    ListNode tmp1 = listNode1;
                    while (tmp1.next != null) {
                        tmp1 = tmp1.next;
                    }
                    tmp1.next = new ListNode(integer);
                }, (listNode12, listNode2) -> Function.identity());
        System.out.println(listNode.val);
    }
    public static class ListNode {
        int val;
        ListNode next;
        public ListNode(int x) {
            val = x;
        }
    }
}
相关文章
|
6月前
|
消息中间件 NoSQL Java
别再用 Redis List 实现消息队列了,Stream 专为队列而生
别再用 Redis List 实现消息队列了,Stream 专为队列而生
140 0
|
5月前
|
消息中间件 负载均衡 NoSQL
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
Redis系列学习文章分享---第七篇(Redis快速入门之消息队列--List实现消息队列 Pubsub实现消息队列 stream的单消费模式 stream的消费者组模式 基于stream消息队列)
71 0
|
4月前
|
存储 C++
C++的list-map链表与映射表
```markdown C++ 中的`list`和`map`提供链表和映射表功能。`list`是双向链表,支持头尾插入删除(`push_front/push_back/pop_front/pop_back`),迭代器遍历及任意位置插入删除。`map`是键值对集合,自动按键排序,支持直接通过键来添加、修改和删除元素。两者均能使用范围for循环遍历,`map`的`count`函数用于统计键值出现次数。 ```
|
5月前
|
存储 C++
C++的list-map链表与映射表
这篇教程介绍了C++中`list`链表和`map`映射表的基本使用。`list`链表可通过`push_front()`、`push_back()`、`pop_front()`和`pop_back()`进行元素的添加和删除,使用迭代器遍历并支持在任意位置插入或删除元素。`map`是一个键值对的集合,元素自动按键值排序,可使用下标操作符或`insert()`函数插入元素,通过迭代器遍历并修改键值对,同时提供`count()`方法统计键值出现次数。教程中包含多个示例代码以帮助理解和学习。
|
5月前
|
Java
java操作list使用Stream
java操作list使用Stream
|
5月前
|
C++ 容器
【C++进阶】深入STL之list:高效双向链表的使用技巧
【C++进阶】深入STL之list:高效双向链表的使用技巧
59 0
|
5月前
|
存储 NoSQL Redis
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
Redis第四弹,Redis实现list时候做出的优化ziplist(压缩链表,元素少的情况),可更好的节省空间list——(内部编码:quicklist)Object encoding
|
6月前
|
存储 Python
链表(Linked List)详解
链表(Linked List)详解
50 0
|
6月前
|
测试技术 C语言
如何用C语言实现无头单向非循环链表Single List ?
这篇文档介绍了一个关于单链表数据结构的实现和相关操作。单链表是一种线性数据结构,每个元素(节点)包含数据和指向下一个节点的指针。文档中列出了单链表的图示,并提供了C语言实现单链表的代码,包括动态申请节点、打印链表、头插、尾插、头删、尾删、查找和在特定位置插入或删除节点等函数。 此外,文档还包含了三个测试用例(TestSList1至TestSList4),展示了如何使用这些函数创建、修改和操作单链表。这些测试用例涵盖了插入、删除、查找等基本操作,以及在链表中特定位置插入和删除节点的场景。
41 0
|
6月前
【stream】List根据某个字段求和
【stream】List根据某个字段求和
346 0