• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

奋斗的软件工程师

  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

Stream API对数组进行操作。

import java.util.Arrays;
import java.util.stream.Stream;

/**
 * 主程序类,演示了如何使用Stream API对数组进行操作。
 */
public class App {

    /**
     * 主方法,展示了不同方式将数组转换为Stream并进行过滤操作。
     * 
     * @param args 命令行参数(未使用)
     */
    public static void main(String[] args) {
        // 示例1:对整型数组使用Arrays.stream进行流转换,然后过滤出偶数并打印
        int[] arr = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
        Arrays.stream(arr).filter(i -> i % 2 == 0).forEach(System.out::println);

        // 示例2:使用Stream.of方法创建流,对整型数组进行过滤操作并打印
        Stream.of(arr).filter(i -> i % 2 == 0).forEach(System.out::println);

        // 示例3:将整型数组转换为List,然后通过stream方法创建流,过滤出偶数并打印
        Arrays.asList(arr).stream().filter(i -> i % 2 == 0).forEach(System.out::println);

        // 示例4:对整型对象数组使用Arrays.stream进行流转换,过滤出偶数并打印
        Integer[] brr = new Integer[] { 9, 2, 8, 1, 5, 1 };
        Arrays.stream(brr).filter(i -> i % 2 == 0).forEach(System.out::println);

        // 示例5:使用Stream.of方法创建流,对整型对象数组进行过滤操作并打印
        Stream.of(brr).filter(i -> i % 2 == 0).forEach(System.out::println);

        // 示例6:将整型对象数组转换为List,然后通过stream方法创建流,过滤出偶数并打印
        Arrays.asList(brr).stream().filter(i -> i % 2 == 0).forEach(System.out::println);
    }
}

运行上述代码,程序无法通过编译阶段,Operator '%' cannot be applied to 'int[]', 'int'

这个错误是由于在示例2和示例3中,尝试将一个整型数组作为整体传递给 filter 方法,而该方法期望的是一个单独的整型值,而不是整型数组。

示例2中:Stream.of(arr).filter(i -> i % 2 == 0).forEach(System.out::println);

Stream.of(arr) 创建了一个流,但是 filter 方法期望对流中的每个元素进行操作,而不是整个数组。因此,需要对数组中的每个元素进行操作,可以通过使用 map 方法将每个整型数组元素映射为流中的单个元素:

Stream.of(arr).flatMapToInt(Arrays::stream).filter(i -> i % 2 == 0).forEach(System.out::println);

示例3中:Arrays.asList(arr).stream().filter(i -> i % 2 == 0).forEach(System.out::println);

Arrays.asList(arr) 创建了一个包含整型数组的列表,但是列表中的元素仍然是整型数组,而不是单个的整型值。因此,在这里也需要将每个整型数组的元素映射为流中的单个元素:

Arrays.stream(arr).filter(i -> i % 2 == 0).forEach(System.out::println);

修改如下

        // 示例2:使用Stream.of方法创建流,对整型数组进行过滤操作并打印
        // Stream.of(arr).filter(i -> i % 2 == 0).forEach(System.out::println);
        Stream.of(arr).flatMapToInt(Arrays::stream).filter(i -> i % 2 == 0).forEach(System.out::println);

        // 示例3:将整型数组转换为List,然后通过stream方法创建流,过滤出偶数并打印
        // Arrays.asList(arr).stream().filter(i -> i % 2 ==
        // 0).forEach(System.out::println);
        Arrays.stream(arr).filter(i -> i % 2 == 0).forEach(System.out::println);

示例4.5可以执行,但是示例2.3不行,为什么?

示例4和示例5可以执行,而示例2和示例3不能执行的原因是因为在 Java 中,Stream API 在处理基本数据类型数组和对象数组时有所区别。

示例4和示例5中,整型对象数组 Integer[] brr 的元素类型是 Integer,而不是基本数据类型 int。因此,Arrays.stream(brr) 和 Stream.of(brr) 可以直接创建流,并对数组中的元素进行操作。

但是,在示例2和示例3中,arr 是一个基本数据类型 int 的数组,而 Stream.of(arr) 和 Arrays.asList(arr) 方法无法直接创建流,因为它们无法识别基本数据类型的数组。在这种情况下,你需要手动转换基本数据类型数组为流的元素,可以使用 Arrays.stream(arr) 方法来创建流,然后进行操作。

综上所述,示例4和示例5中的数组类型是对象数组,因此可以直接使用 Stream.of() 创建流,而示例2和示例3中的数组类型是基本数据类型数组,需要使用 Arrays.stream() 方法将其转换为流。

posted on 2024-04-09 12:24  周政然  阅读(61)  评论(1)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3