Java 中 List 集合 Stream 流详解

简介: Java 中 List 集合 Stream 流详解

Java 中 List 集合 Stream 流详解


一、Stream流介绍

在JDK8时,JAVA新增了lambda表达式,它与 java.io 包里的 InputStream和 OutputStream是完全不同的概念,他更跟流没有任何关系。它也不同于 StAX 对 XML解析的 Stream,也不是 Amazon Kinesis 对大数据实时处理的Stream。

JDK8 中的 Stream 是对集合(Collection)对象功能的增强,它借助于lambda表达式,更优雅的表达风格,极大的提高编程效率和程序可读性。它针对于对集合对象进行各种非常便利、高效的聚合操作,或者大批量数据操作。不多说,上用法。

二丶Stream流实现与传统方式实现对比

**案例:**找出列表中包含张三且姓名长度为2的名字

2.1、传统方式实现

package com.controller;
import java.util.ArrayList;
public class Aoo {
    public static void main(String[] args) {
        // 1.定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("张四");
        list.add("四");
        list.add("张四");
        list.add("张四");
        list.add("张四");
        list.add("张四");
        // 2.挑选list中包含张三的
        ArrayList<String> list1 = new ArrayList<>();
        for (String s : list) {
            if (s.startsWith("张三")){
                list1.add(s);
            }
        }
        System.out.println("挑选list包含张三的结果:"+list1);
        // 3.再从list1中挑选挑选名字长度为2的
        ArrayList<String> list2 = new ArrayList<>();
        for (String s : list1) {
            if (s.length() == 2){
                list2.add(s);
            }
        }
        System.out.println("挑选list1长度为2的结果:"+list2);
        // 4、遍历
        for (String s : list2) {
            System.out.println("最终结果 = " + s);
        }
    }
}

2.2、Stream流方式实现

package com.controller;
import java.util.ArrayList;
public class Boo {
    public static void main(String[] args) {
        // 定义一个集合,并填入数据
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("李四");
        list.add("李四");
        list.add("王五");
        list.add("王五");
        list.add("王五");
        //Stream流的实现
        list.stream()
                .filter((name) -> name.startsWith("张三"))
                .filter((name) -> name.length()==2)
                .forEach((name) -> System.out.println(name));
    }
}

三、Stream流的常用API

3.1、stream流的获取

在Collection集合下,均有一个stream(),另一个即是用Stream的一个静态方法 of() 实现。

上代码:

package com.controller;
import java.util.ArrayList;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
import java.util.stream.Stream;
public class Boo {
    public static void main(String[] args) {
        //Collction集合
        Collection<String> collection = new ArrayList();
        Stream<String> stream = collection.stream();
        //List集合
        List<String> list = new ArrayList<>();
        Stream<String> stream1 = list.stream();
        //ArrayList集合
        ArrayList<String> arrayList = new ArrayList<>();
        Stream<String> stream2 = arrayList.stream();
        //LinkedList集合
        LinkedList<String> linkedList = new LinkedList<>();
        Stream<String> stream3 = linkedList.stream();
        //of()方式的实现
        List<String> list1 = new ArrayList<>();
        Stream<List<String>> stream4 = Stream.of(list1);
        //传入可变数组
        Stream<String> stream5 = Stream.of("1","2","3","4");
    }
}

3.2、forEach()

遍历流中的对象

ackage com.controller;
import java.util.ArrayList;
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四");
        list.add("李四");
        list.add("李四");
        list.add("李四");
        list.add("李四");
        list.add("李四");
        //遍历流的对象
        list.stream().forEach((name) -> System.out.println(name));
    }
}

3.3、filter()

filter对流对象进行过滤操作

package com.controller;
import java.util.ArrayList;
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("张三");
        list.add("李四二");
        list.add("李四我");
        list.add("李四去晚");
        list.add("李四请问");
        list.add("李四去");
        list.add("李四我");
        //过滤流的对象
        list.stream().filter((name) -> name.length()==2);
    }
}

3.4、map()

map()是对集合中的对象进行映射的,将对象从一种类型转换成另一种类型

package com.controller;
import java.util.ArrayList;
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
        //map()是对集合中的对象进行映射的,将对象从一种类型转换成另一种类型
        list.stream().map(num -> Integer.parseInt(num));
    }
}

3.5、count()

count是对流数据统计的方法,但是count之后返回的是long类型,因此无法再进行流操作。

ackage com.controller;
import java.util.ArrayList;
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        list.add("5");
        list.add("6");
        list.add("7");
        //count()对流数据进行统计
        System.out.println(list.stream().count());
    }
}
3.6、limit()

3.6、limit()

选取流数据的前多少条数据

package com.controller;
import java.util.ArrayList;
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("李二1");
        list.add("李二2");
        list.add("李二3");
        list.add("李二4");
        list.add("李二5");
        list.add("李二6");
        list.add("李二7");
        //limit() 选取流数据的前多少条数据
        list.stream().limit(2);
    }
}

3.7、skip()

跳过流数据的前多少条数据,该方法与limit()方法刚好相反

package com.controller;
import java.util.ArrayList;
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("李小龙1");
        list.add("李小龙2");
        list.add("李小龙3");
        list.add("李小龙4");
        list.add("李小龙5");
        list.add("李小龙6");
        list.add("李小龙7");
        //skip() 跳过流数据的前多少条数据
        list.stream().skip(2);
    }
}

3.8、concat()

Stream的静态方法concat()实现对两个流数据进行合并

package com.controller;
import java.util.ArrayList;
import java.util.stream.Stream;
public class Aoo {
    public static void main(String[] args) {
        // 定义一个集合
        ArrayList<String> list = new ArrayList<>();
        list.add("张三丰1");
        list.add("张三丰2");
        list.add("张三丰3");
        list.add("张三丰4");
        list.add("张三丰5");
        list.add("张三丰6");
        list.add("张三丰7");
        // 定义一个集合
        ArrayList<String> list1 = new ArrayList<>();
        list1.add("1");
        list1.add("2");
        list1.add("3");
        list1.add("4");
        list1.add("5");
        list1.add("6");
        list1.add("7");
        //concat()实现对两个流数据进行合并
        Stream.concat(list.stream(),list1.stream());
    }
}

四、总结

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。Stream API可以极大提高Java程序员的生产力,让

程序员写出高效率、干净、简洁的代码。这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。

相关文章
|
6天前
|
Java
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式
Java 8 引入的 Streams 功能强大,提供了一种简洁高效的处理数据集合的方式。本文介绍了 Streams 的基本概念和使用方法,包括创建 Streams、中间操作和终端操作,并通过多个案例详细解析了过滤、映射、归并、排序、分组和并行处理等操作,帮助读者更好地理解和掌握这一重要特性。
14 2
|
6天前
|
安全 Java
Java多线程集合类
本文介绍了Java中线程安全的问题及解决方案。通过示例代码展示了使用`CopyOnWriteArrayList`、`CopyOnWriteArraySet`和`ConcurrentHashMap`来解决多线程环境下集合操作的线程安全问题。这些类通过不同的机制确保了线程安全,提高了并发性能。
|
10天前
|
存储 Java
判断一个元素是否在 Java 中的 Set 集合中
【10月更文挑战第30天】使用`contains()`方法可以方便快捷地判断一个元素是否在Java中的`Set`集合中,但对于自定义对象,需要注意重写`equals()`方法以确保正确的判断结果,同时根据具体的性能需求选择合适的`Set`实现类。
|
10天前
|
存储 Java 开发者
在 Java 中,如何遍历一个 Set 集合?
【10月更文挑战第30天】开发者可以根据具体的需求和代码风格选择合适的遍历方式。增强for循环简洁直观,适用于大多数简单的遍历场景;迭代器则更加灵活,可在遍历过程中进行更多复杂的操作;而Lambda表达式和`forEach`方法则提供了一种更简洁的函数式编程风格的遍历方式。
|
10天前
|
Java 开发者
|
10天前
|
存储 Java 开发者
Java中的集合框架深入解析
【10月更文挑战第32天】本文旨在为读者揭开Java集合框架的神秘面纱,通过深入浅出的方式介绍其内部结构与运作机制。我们将从集合框架的设计哲学出发,探讨其如何影响我们的编程实践,并配以代码示例,展示如何在真实场景中应用这些知识。无论你是Java新手还是资深开发者,这篇文章都将为你提供新的视角和实用技巧。
11 0
|
15天前
|
Java API Apache
java集合的组内平均值怎么计算
通过本文的介绍,我们了解了在Java中计算集合的组内平均值的几种方法。每种方法都有其优缺点,具体选择哪种方法应根据实际需求和场景决定。无论是使用传统的循环方法,还是利用Java 8的Stream API,亦或是使用第三方库(如Apache Commons Collections和Guava),都可以有效地计算集合的组内平均值。希望本文对您理解和实现Java中的集合平均值计算有所帮助。
23 0
|
3月前
|
存储 安全 Java
【Java集合类面试二十五】、有哪些线程安全的List?
线程安全的List包括Vector、Collections.SynchronizedList和CopyOnWriteArrayList,其中CopyOnWriteArrayList通过复制底层数组实现写操作,提供了最优的线程安全性能。
|
3月前
|
Java
【Java集合类面试二十三】、List和Set有什么区别?
List和Set的主要区别在于List是一个有序且允许元素重复的集合,而Set是一个无序且元素不重复的集合。
|
23天前
|
安全 Java 程序员
深入Java集合框架:解密List的Fail-Fast与Fail-Safe机制
本文介绍了 Java 中 List 的遍历和删除操作,重点讨论了快速失败(fail-fast)和安全失败(fail-safe)机制。通过普通 for 循环、迭代器和 foreach 循环的对比,详细解释了各种方法的优缺点及适用场景,特别是在多线程环境下的表现。最后推荐了适合高并发场景的 fail-safe 容器,如 CopyOnWriteArrayList 和 ConcurrentHashMap。
52 5