Java 8 Stream API

本文详细介绍了Java 8的Stream API,包括Lambda表达式、创建Stream、中间操作(filter、map、flatMap、sorted等)和终结操作(forEach、count、toArray等)。Stream API极大提升了代码的简洁性和效率,是Java 8的重要特性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java 8 介绍

  1. Java 8 发版于 2014 年,多年过去,目前依旧是最常用的 JDK 版本
  2. Java 8 在增强代码可读性、简化代码方面,增加了很多功能,比如 Lambda、Stream 流操作、并行流(ParallelStream)、Optional 可空类型、新的日期时间类型等
  3. Lambda 表达式配合 Stream 流操作为我们日常编码极大的提升了效率

Lambda 表达式

  1. 匿名类内部类虽然没有类名,但还是要给出方法定义

  2. Lambda 表达式的初衷是进一步简化匿名类的语法

  3. 在实现上,Lambda 表达式并不是匿名类的语法糖

  4. Lambda 和匿名类的示例

    public class ThreadCreator {
        public static Thread createThreadByAnonymous() {
            return new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Anonymous thread print");
                }
            });
        }
    
        public static Thread createThreadByLambda() {
            return new Thread(() -> {
                System.out.println("Lambda thread print");
            });
        }
    }
  5. Lambda 表达式如何匹配类型接口?=> 函数式接口

    函数式接口是一种只有单一抽象方法的接口,使用 @FunctionalInterface 来描述,可以隐式地转换成 Lambda 表达式

    使用 Lambda 表达式创建函数式接口的示例, 可以让函数成为程序的一等公民,从而像普通数据一样当作参数传递

    JDK 的 java.util.function 中提供了许多原生的函数式接口,如 Supplier

    
    @FunctionalInterface
    public interface Supplier<T> {
    
        /**
         * Gets a result.
         *
         * @return a result
         */
        T get();
    }

    使用 Lamda 或方法引用来得到函数式接口的实例

    // 使用 Lambda 表达式提供 Supplier 接口实现,返回 OK 字符串
    Supplier<String> stringSupplier = () ->"OK";
    // 使用方法引用提供 Supplier 接口实现,返回空字符串
    Supplier<String> supplier = String::new;

    方法引用是 Lambda 表达式的另一种表现形式

    Lambda 表达式可用方法引用代替的场景:Lambda 表达式的主体仅包含一个表达式,且该表达式仅调用了一个已经存在的方法

    方法引用可以是:

    • 类 : : 静态方法
    • 类 : : new
    • 类 : : 实例方法((A, B) -> A.实例方法(B) <=> A 的类 : : 实例方法)
    • 任意对象 : : 实例方法

创建 Stream

  1. 利用 stream 方法将 list 或数组转换为流

    Arrays.asList("a1", "a2", "a3").stream().forEach(System.out::println);
    Arrays.stream(new int[]{1, 2, 3}).forEach(System.out::println);

    非基本数据类型的数值也可以使用 Arrays.asList 方法转 list 再调 stream

  2. 通过 Stream.of 方法直接传入多个元素构成一个流

    String[] arr = {"a", "b", "c"};
    Stream.of(arr).forEach(System.out::println);
    Stream.of("a", "b", "c").forEach(System.out::println);
    Stream.of(1, 2, "a").map(item -> item.getClass().getName())
        .forEach(System.out::println);
  3. 通过 Stream.iterate 方法使用迭代的方式构造一个无限流,然后使用 limit 限制流元素个数

    Stream.iterate(2, item -> item * 2).limit(10).forEach(System.out::println);
    Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.TEN))
        .limit(10).forEach(System.out::println);
  4. 通过 Stream.generate 方法从外部传入一个提供元素的 Supplier 来构造无限流,再使用 limit 限制流元素个数

    Stream.generate(() -> "test").limit(3).forEach(System.out::println);
    Stream.generate(Math::rando
<think>好的,用户想在Mac上使用LlamaFactory训练机器习模型。首先,我需要回忆一下之前提供的引用内容。引用[1]提到使用Llama-Factory训练LoRA模型,比如增强GLM-4-9B-Chat模型的脑筋急转弯能力,并提到了环境准备。引用[2]和[3]涉及LLaMA2的训练和配置,虽然用户询问的是LlamaFactory,但可能步骤类似。引用[4]是关于Ollama导入模型的文档,可能与模型部署相关。 首先,用户的环境是Mac,需要考虑系统兼容性。需要指导用户安装要的依赖,比如Python、PyTorch,可能还需要CUDA支持,但Mac可能使用MPS加速。然后,克隆LlamaFactory仓库,安装依赖库,如requirements.txt。接着是数据集的准备和处理,需要下载数据集并进行tokenize预处理,这可能比较耗时。之后修改配置文件,选择适合的模型参数,可能涉及调整batch size或习率以适应Mac的硬件限制。开始训练时要指定正确的参数,比如模型路径、数据集路径和LoRA配置。训练完成后,进行模型推理测试,确保模型正确运行。最后,导出模型以便后续使用,可能参考Ollama的导入方法。 需要提醒用户注意Mac的硬件限制,比如内存和显存,可能需要调整配置参数避免内存溢出。同时,引用中提到的示例是增强GLM-4模型的脑筋急转弯能力,用户的应用场景可能不同,需根据需求调整数据集和训练参数。另外,用户可能需要查看LlamaFactory的官方文档,确保步骤正确,特别是Mac特有的设置,比如使用MPS后端替代CUDA。最后,生成相关问题时要覆盖环境准备、配置调整、性能优化和应用场景等方面。</think>### 在 Mac 上使用 LlamaFactory 训练模型的步骤 #### 1. **环境准备** - **安装 Python 和 PyTorch** Mac 推荐通过 `conda` 或 `pyenv` 管理 Python 环境,安装 Python 3.8+ 版本。 使用以下命令安装 PyTorch(Mac 需选择 MPS 加速支持版本): ```bash pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cpu ``` - **克隆 LlamaFactory 仓库** 从 GitHub 克隆仓库并安装依赖: ```bash git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Factory pip install -r requirements.txt ``` 引用[1]提到环境需依赖 Python 和 PyTorch,Mac 本地训练时注意选择 CPU/MPS 模式[^1]。 --- #### 2. **数据集处理** - **下载数据集** 选择适合任务的数据集(如 JSON/CSV 格式),例如对话数据集或特定领域文本。 - **Tokenize 预处理** 使用模型对应的 tokenizer 处理数据(需与模型匹配),例如: ```python from transformers import AutoTokenizer tokenizer = AutoTokenizer.from_pretrained("THUDM/glm-4b-ft") tokenized_data = tokenizer(dataset_text, padding=True, truncation=True) ``` 引用[2]强调数据集预处理可能耗时较长,建议先验证数据格式[^2]。 --- #### 3. **配置训练参数** - **修改配置文件** 在 `train_args.yaml` 中设置: ```yaml model_name_or_path: "THUDM/glm-4-9B-Chat" # 替换为你的模型路径 dataset_path: "./data/train.json" output_dir: "./output" lora_rank: 8 # LoRA 参数 per_device_train_batch_size: 2 # Mac 需调小 batch_size 避免内存不足 ``` 引用[3]提到配置需适配设备性能,Mac 需特别注意显存限制[^3]。 --- #### 4. **启动训练** - **执行训练命令** 使用以下命令启动 LoRA 微调: ```bash python src/train.py --config train_args.yaml ``` 若显存不足,可添加 `--use_cpu` 强制使用 CPU 训练: ```bash python src/train.py --config train_args.yaml --use_cpu ``` --- #### 5. **模型导出与测试** - **导出适配 Ollama 的格式** 训练完成后,将模型转换为 GGUF 格式: ```bash python scripts/convert_to_gguf.py --model_dir ./output --output_file model.gguf ``` 参考引用[4],通过 Ollama 导入模型进行部署[^4]。 --- ### 关键注意事项 1. **硬件限制** Mac 的 M1/M2 芯片可使用 `mps` 加速,但大模型(如 GLM-4-9B)需降低 `batch_size` 或使用量化(如 4-bit 训练)。 2. **模型兼容性** LlamaFactory 目前主要支持 LLaMA、GLM 等架构,需确认模型与框架的匹配性[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值