您现在的位置是:首页 > 编程 > 

深入理解Java 8的流式API:简化代码,提升效率

2025-07-21 07:55:43
深入理解Java 8的流式API:简化代码,提升效率 深入理解Java 8的流式API:简化代码,提升效率Java 8引入了Stream API,它提供了一种新的抽象,可以更方便地对集合进行操作和处理。想深入了解Stream流的小伙伴可以看看我以前的源码文章:1、 深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘_jdk中的流-CSD博客 2、 Java流操作解析

深入理解Java 8的流式API:简化代码,提升效率

深入理解Java 8的流式API:简化代码,提升效率

Java 8引入了Stream API,它提供了一种新的抽象,可以更方便地对集合进行操作和处理。

想深入了解Stream流的小伙伴可以看看我以前的源码文章

1、 深度解析Java JDK 1.8中Stream流的源码实现:带你探寻数据流的奥秘_jdk中的流-CSD博客

2、 Java流操作解析:深度剖析中间操作、终端操作与并行处理机制_流操作 中间操作有哪些-CSD博客

一、流 Stream

Stream API允许我们以一种声明性的方式处理数据,支持函数式编程风格。

String流主要特性和用法

  1. 创建流
    • 从集合创建:通过集合的stream()方法或parallelStream()方法来创建流。
    • 从数组创建:使用Arrays.stream(array)方法。
    • 使用静态工厂方法:如()IntStream.range()等。
  2. 中间操作
    • filter(Predicate):根据条件过滤流中的元素。
    • map(Function):将流中的每个元素映射为另一个元素。
    • sorted():对流进行排序。
    • distinct():去除流中重复的元素。
    • limit(long):限制流中元素的数量。
  3. 终端操作
    • forEach(Cumer):对流中的每个元素执行操作。
    • collect(Collectors):将流元素归约和汇总成一个值,如List、Set、Map等。
    • reduce():归约操作,可以将流中的元素反复结合起来,得到一个值。
    • min()max():出流中的最小和最大值。
    • count():返回流中元素的总数。
    • anyMatch(), allMatch(), noneMatch():检查流中是否存在满足条件的元素。

如何使用Java 8的Stream API来操作集合

代码语言:java复制
public static void main(String[] args) {
        List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd", "", "jkl");

        // 打印非空字符串的数量:使用`filter`方法过滤出非空字符串,然后使用`count`方法获取数量
        long count = strings.stream()
                .filter(string -> !string.isEmpty())
                .count();
        println("非空字符串数量:" + count);

        // 打印非空字符串的列表:使用`filter`方法过滤出非空字符串,然后使用`collect(())`将结果收集为List
        List<String> filtered = strings.stream()
                .filter(string -> !string.isEmpty())
                .collect(());
        println("非空字符串列表:" + filtered);

        // 使用逗号连接非空字符串:使用`filter`方法过滤出非空字符串,然后使用`collect(Collectors.joining(", "))`连接成一个字符串
        String mergedString = strings.stream()
                .filter(string -> !string.isEmpty())
                .collect(Collectors.joining(", "));
        println("连接后的字符串:" + mergedString);

        // 获取最长的字符串:使用`max`方法到最长的字符串,如果不到则返回空字符串
        String longestString = strings.stream()
                .max((s1, s2) -> s1.length() - s2.length())
                .orElse("");
        println("最长的字符串:" + longestString);
    }
二、Int | Long | Double Stream

IntStreamLongStreamDoubleStream 是基本类型的流,提供了对整数、长整数和双精度浮点数的高效处理。

IntStream 的元素类型为 int

  • 创建方式
    • range(int startInclusive, int endExclusive):创建一个范围在 [startInclusive, endExclusive) 内的 IntStream
    • rangeClosed(int startInclusive, int endInclusive):创建一个范围在 [startInclusive, endInclusive] 内的 IntStream
    • of(int... values):从一组整数值创建一个 IntStream
  • 常用方法
    • sum():对流中的所有整数求和。
    • average():计算流中所有整数的平均值。
    • min()max():出流中的最小和最大值。
    • forEach(IntCumer action):对流中的每个整数执行指定操作。

LongStream 的元素类型为 long

  • 创建方式
    • range(long startInclusive, long endExclusive):创建一个范围在 [startInclusive, endExclusive) 内的 LongStream
    • rangeClosed(long startInclusive, long endInclusive):创建一个范围在 [startInclusive, endInclusive] 内的 LongStream
    • of(long... values):从一组长整数值创建一个 LongStream
  • 常用方法
    • sum():对流中的所有长整数求和。
    • average():计算流中所有长整数的平均值。
    • min()max():出流中的最小和最大值。
    • forEach(LongCumer action):对流中的每个长整数执行指定操作。

DoubleStream 的元素类型为 double

  • 创建方式
    • of(double... values):从一组双精度浮点数值创建一个 DoubleStream
    • range(double startInclusive, double endInclusive):创建一个在指定范围内的 DoubleStream
  • 常用方法
    • sum():对流中的所有双精度浮点数求和。
    • average():计算流中所有双精度浮点数的平均值。
    • min()max():出流中的最小和最大值。
    • forEach(DoubleCumer action):对流中的每个双精度浮点数执行指定操作。

使用 IntStreamLongStreamDoubleStream 基本的操作

代码语言:java复制
 public static void main(String[] args) {
        // IntStream 
        IntStream.range(1, 5)
                .forEach(::print);  
        // 输出:124
        println();

        int sum = Int(1, 2, , 4, 5)
                .sum();  
     	// 计算总和:15
        println("Sum of integers: " + sum);

        // LongStream 
        long max = LongStream.rangeClosed(1, 10)
                .max()
                .orElse(0);  
     	// 出最大值:10
        println("Max of long integers: " + max);

        // DoubleStream
        double average = Double(1.5, 2.5, .5, 4.5)
                .average()
                .orElse(0.0);  
     	// 计算平均值:.0
        println("Average of doubles: " + average);
    }
三、收集器 Collectors

收集器(Collectors)用于将流的元素累积到集合中,或者进行聚合操作。在使用流进行数据处理时,收集器是非常有用的工具,它们能够简化代码并提高效率。

常用的收集器及其用法:

1.toList()

  • 将流中的元素收集到一个列表中。
代码语言:java复制
   List<String> list = (());

2.toSet()

  • 将流中的元素收集到一个集合(集合元素不重复)中。
代码语言:java复制
   Set<String> set = (());

.toMap()

  • 将流中的元素根据指定的 keyMapper 和 valueMapper 转换为 Map。
代码语言:java复制
   Map<Integer, String> map = ((String::length, Function.identity()));

4.joining()

  • 连接流中的元素成为一个字符串。
代码语言:java复制
   String result = (Collectors.joining(", "));

5.groupingBy()

  • 根据某个属性对流中的元素进行分组,生成一个 Map,键为属性,值为对应属性的元素列表。
代码语言:java复制
   Map<Integer, List<String>> groupedByLength = (Collectors.groupingBy(String::length));

6.partitioningBy()

  • 根据一个条件将流中的元素分为两组,生成一个 Map,键为 true/false,值为满足条件的元素列表。
代码语言:java复制
   Map<Boolean, List<String>> partitioned = (Collectors.partitioningBy(s -> s.length() > ));

7.summarizingInt() / summarizingDouble() / summarizingLong()

  • 统计流中元素的汇总信息,如最大值、最小值、平均值、总和等。
代码语言:java复制
   IntSummaryStatistics stats = (Collectors.summarizingInt(String::length));
   

如何将一个字符串流收集成一个列表,并按长度分组

代码语言:java复制
public static void main(String[] args) {
        List<String> words = Arrays.asList("apple", "banana", "grape", "pear", "orange");

        // 将流中的元素收集到一个列表中
        List<String> wordList = words.stream()
                                    .collect(());
        println("List of words: " + wordList);

        // 根据字符串长度分组
        Map<Integer, List<String>> groupedByLength = words.stream()
                                                        .collect(Collectors.groupingBy(String::length));
        println("Words grouped by length: " + groupedByLength);
    }

智者的梦再美,也不如愚人实干的脚印

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1166393.html

相关标签:无
上传时间: 2025-07-21 03:27:46
留言与评论(共有 5 条评论)
本站网友 瑶芳
7分钟前 发表
代码语言:java复制 Map<Integer
本站网友 七通一平
18分钟前 发表
并按长度分组:代码语言:java复制public static void main(String[] args) { List<String> words = Arrays.asList("apple"
本站网友 写博客软件
1分钟前 发表
收集器 Collectors收集器(Collectors)用于将流的元素累积到集合中
本站网友 tight是什么意思
5分钟前 发表
终端操作与并行处理机制_流操作 中间操作有哪些-CSD博客 一