当前位置: 首页 > news >正文

【进阶篇-Day3:JAVA接口新特性、代码块、内部类、Lambda表达式、组件等的介绍】

目录

  • 1、接口新特性
    • 1.1 JDK8的新特性
    • 1.2 JDK9的新特性
  • 2、代码块
    • 2.1 代码块的定义
    • 2.2 代码块的分类
  • 3、内部类
    • 3.1 内部类的定义
    • 3.2 内部类成员访问
    • 3.3 学习内部类的原因
    • 3.4 内部类的分类
      • 3.4.1 成员内部类
      • 3.4.2 静态内部类
      • 3.4.3 局部内部类
      • 3.4.4 匿名内部类
        • (1)定义:
        • (2)使用场景:
  • 4、Lambda表达式
    • 4.1 概述
    • 4.2 案例
    • 4.3 注意事项
    • 4.4 Lambda表达式的省略写法
    • 4.5 Lambda表达式和匿名内部类的区别
  • 5、窗体、组件、事件
    • 5.1 窗体
    • 5.2 组件
      • 5.2.1 按钮组件Jbutton
      • 5.2.2 文本组件Jlabel
    • 5.3 事件
    • 5.4 适配器设计模式
    • 5.5 模板设计模式

1、接口新特性

1.1 JDK8的新特性

在这里插入图片描述

之前说过,接口里面只能是抽象方法,但是JDK8为何要修改成允许定义带方法体的方法呢,原因是什么呢?
答:如果系统要升级版本2,那么在接口中再新加抽象方法时,会导致以前的接口实现对象报错,因此JDK8改成接口中可以定义有方法体的方法,就是为了解决:丰富接口功能的同时,又不需要更改实现类的代码。,如下图:
在这里插入图片描述

下面再看下JDK8是怎么做的:
在这里插入图片描述
在这里插入图片描述

1.2 JDK9的新特性

在这里插入图片描述

为什么JDK9允许定义私有方法呢?
答:
在这里插入图片描述

下面看看JDK9是如何做的:
在这里插入图片描述

2、代码块

2.1 代码块的定义

在这里插入图片描述

2.2 代码块的分类

在这里插入图片描述

package com.itheima.vo;public class Student {//随着类的加载而加载,多用于数据初始化static {System.out.println("Student类的静态代码块...");}//编译时,会分散到每个构造方法的第一行{System.out.println("Student类的构造代码块...");}public Student(){//现在电脑内存都很大了,所以一般不会使用局部代码块提前释放内存{System.out.println("局部代码块...");}System.out.println("Student类的构造方法...");}
}

注:同步代码块多线程会使用到,这个放多线程介绍。

3、内部类

3.1 内部类的定义

在这里插入图片描述
下面是一个例子:

package com.itheima.inner;public class InnerTest {public static void main(String[] args) {Outer.Inner in = new Outer().new Inner();//创建内部类对象in.show();//调用内部类方法}
}class Outer{class Inner{int num = 11;public void show(){System.out.println("show...");}}
}

3.2 内部类成员访问

在这里插入图片描述

看下面这三个变量,第一个是外部类成员变量、第二个是内部类成员变量、第三个是方法里的变量,现在的问题是,如何分别访问他们三个?
答:看代码

class Outer{int num = 11;//外部类成员变量class Inner{int num = 22;//内部类成员变量public void show(){int num = 33;//方法里的变量System.out.println(num); //33System.out.println(this.num); //22System.out.println(Outer.this.num); //11}}
}

注:
1、方法里的变量:直接访问,即就近原则;
2、内部类成员变量:使用this关键字;
3、外部类成员变量:使用外部类名称.this访问。

3.3 学习内部类的原因

在这里插入图片描述

3.4 内部类的分类

在这里插入图片描述

3.4.1 成员内部类

如下所示的Inner就是成员内部类:

class Outer{class Inner{int num = 11;public void show(){System.out.println("show...");}}
}

3.4.2 静态内部类

在这里插入图片描述

注:其实可以发现,静态内部类与成员内部类主要的区别是,创建对象不同。记住一点:只要是静态的,都是使用类名来调用,理解了这一点,不用刻意记也能知道静态内部类是怎么创建的。

3.4.3 局部内部类

局部内部类是指:放在方法、代码块、构造器等执行体中的类。
下面是一个例子:

class A{public void show(){//B是一个局部内部类class B{int num;}}
}

局部内部类只有在调用此代码块时才会调用到,因此鸡肋,使用较少。

3.4.4 匿名内部类

(1)定义:

在这里插入图片描述

注:

  • new 类名(){}:代表继承这个类
  • new 接口名(){}:代表实现这个类
(2)使用场景:

如果发现在调用一个方法时,此方法的参数是一个接口类型,那么有两种办法解决:
1、定义一个此接口的实现类并重写此方法,然后new这个实现类,最后调用这个方法;
2、使用匿名内部类,即new 接口名(){}。

看下面的例子:
在这里插入图片描述
可以发现第二种方法很简洁,因此这就是匿名内部类的使用场景。

对于上述的两种方法,要如何选择呢?
答:如果一个接口的抽象方法很少,则推荐使用匿名内部类,反之使用定义接口实现类的这种方法比较简洁。

4、Lambda表达式

4.1 概述

在这里插入图片描述

4.2 案例

public class InnerTest {public static void main(String[] args) {//这是匿名内部类useInnerA(new InnerA() {@Overridepublic void show() {System.out.println("我是匿名内部类...");}});//使用Lambda表达式,简化匿名内部类useInnerA(()->{System.out.println("我是使用Lambda表达式的匿名内部类...");});}//这是一个形参类型为接口的方法public static void useInnerA(InnerA a){a.show();}
}interface InnerA{void show();
}

4.3 注意事项

在这里插入图片描述

在这里插入图片描述

总结:Lambda表达式只能简化只有一个抽象方法的匿名内部类。

4.4 Lambda表达式的省略写法

在这里插入图片描述
下面我们一条一来看:

  • 参数类型可以省略不写:
//使用Lambda表达式,参数类型可以省略
useInnerA((a, b) -> {System.out.println("我是使用Lambda表达式的匿名内部类...");});
  • 只有一个参数,则参数类型可以省略不写,同时()也可以省略
//使用Lambda表达式,只有一个参数,则参数类型可以省略不写,同时()也可以省略
useInnerA(a -> {System.out.println("只有一个参数,则参数类型可以省略不写,同时()也可以省略...");});
  • Lambda表达式的方法体只有一行代码,大括号和分号都可省略,同时如果是return则必须省略。
//Lambda表达式的方法体只有一行代码,大括号和分号都可省略,同时如果是return则必须省略。
//返回值为字符串类型,只需要写字符串即可,需要省略return语句。
useInnerA(a-> "我是使用Lambda表达式的匿名内部类...");

4.5 Lambda表达式和匿名内部类的区别

在这里插入图片描述

5、窗体、组件、事件

5.1 窗体

在这里插入图片描述

import javax.swing.*;public class JFrameTest {public static void main(String[] args) {//创建窗体对象JFrame jf = new JFrame();//设置窗体大小jf.setSize(511, 511);//修改窗体的关闭模式jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体标题jf.setTitle("大哥的第一个窗口");//设置窗体可见jf.setVisible(true);}
}

5.2 组件

在这里插入图片描述

在这里插入图片描述

5.2.1 按钮组件Jbutton

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看下面代码:

package com.itheima.frame;import javax.swing.*;public class JFrameTest {public static void main(String[] args) {//1、窗体对象//创建窗体对象JFrame jf = new JFrame();//设置窗体大小jf.setSize(511, 511);//修改窗体的关闭模式jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体标题jf.setTitle("我是标题");//取消窗体的默认布局jf.setLayout(null);//2、按钮对象//2.1 创建按钮对象JButton jb = new JButton("确定");jb.setBounds(51,51,111,111);//2.2 将按钮对象添加到面板对象当中jf.getContentPane().add(jb);//设置窗体可见jf.setVisible(true);}
}

在这里插入图片描述

5.2.2 文本组件Jlabel

在这里插入图片描述

在这里插入图片描述

5.3 事件

在这里插入图片描述

在这里插入图片描述

  • 动作监听:
    在这里插入图片描述
package com.itheima.action;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;public class ActionTest {public static void main(String[] args) {//1、窗体对象//创建窗体对象JFrame jf = new JFrame();//设置窗体大小jf.setSize(511, 511);//修改窗体的关闭模式jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体标题jf.setTitle("我是标题");//取消窗体的默认布局jf.setLayout(null);//2、按钮对象//2.1 创建按钮对象JButton jb = new JButton("确定");jb.setBounds(51,51,111,111);//2.2 将按钮对象添加到面板对象当中jf.getContentPane().add(jb);//3、事件监听jb.addActionListener(new AbstractAction() {@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("我被点击了");}});//设置窗体可见jf.setVisible(true);}
}
  • 键盘事件:
    在这里插入图片描述
package com.itheima.action;import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;public class KeyActionTest {public static void main(String[] args) {//1、窗体对象//创建窗体对象JFrame jf = new JFrame();//设置窗体大小jf.setSize(511, 511);//修改窗体的关闭模式jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置窗体标题jf.setTitle("我是标题");//取消窗体的默认布局jf.setLayout(null);//键盘事件jf.addKeyListener(new KeyListener() {@Overridepublic void keyTyped(KeyEvent e) {}@Overridepublic void keyPressed(KeyEvent e) {//键盘按下时触发事件int keyCode = e.getKeyCode();if (keyCode == 37){System.out.println("左移动业务...");} else if (keyCode == 38) {System.out.println("上移动业务...");} else if (keyCode == 39) {System.out.println("右移动业务...");} else if (keyCode == 40) {System.out.println("下移动业务...");}}@Overridepublic void keyReleased(KeyEvent e) {//键盘松开时触发事件
//                System.out.println("键盘松开了...");}});//设置窗体可见jf.setVisible(true);}
}

5.4 适配器设计模式

在这里插入图片描述

上述对适配器设计模式的描述可能不够清晰,下面再用大白话解释一下:

当我们写了一个接口后,我们会将这个接口进行实现。在进行一个实现时,我们发现无论怎么样,这个实现类是一定要重写接口里的所有方法的,那有什么方法只重写想要的方法呢,这个就是适配器要解决的问题。

  • 解决思路:

先编写一个适配器(抽象方法),让适配器来实现这个接口,然后我们要写的实现类只需要继承适配器就可以了,这样我们需要实现哪个方法就重写哪个即可。
如下所示::
在这里插入图片描述

  • 解决步骤:

在这里插入图片描述

5.5 模板设计模式

在这里插入图片描述

上面的陈述可能还不是太清晰,下面再通俗的解释一下:

模板设计模式,其实就是先写一个抽象类,然后在抽象类里写一个模板方法,依次调用业务逻辑代码,但是发现有些业务逻辑代码并不通用,于是把这些不通用的代码抽为一个或者几个方法,然后将这几个方法定义为抽象方法,让子类去实现,这样子类就会有各自的业务逻辑,这个就是模板设计模式。

下面看一段代码:

package com.itheima.design.template;public abstract class CompositionTemplate {/*** write方法是模板,但是里面的body是随着每个实现类的不同而不同,因此需要定义为抽象方法*/public void write(){System.out.println("我的爸爸");body();System.out.println("啊~ 这就是我的爸爸~");}abstract void body();
}public class Tom extends CompositionTemplate{@Overridevoid body() {System.out.println("我的爸爸是一个很严肃的人,每天工作很长时间。。。");}
}public class Test {public static void main(String[] args) {Tom t = new Tom();t.write();}
}输出:我的爸爸
我的爸爸是一个很严肃的人,每天工作很长时间。。。
啊~ 这就是我的爸爸~Process finished with exit code 0

注意:上述代码中,要是子类重写了write方法,那岂不是不遵循当初定义的模板了?为了防止重写write方法,可以把write方法定义为最终的,即前面加关键字final,如下所示:

public abstract class CompositionTemplate {/*** write方法是模板,但是里面的body是随着每个实现类的不同而不同,因此需要定义为抽象方法*/public final void write(){//定义为最终的,防止重写System.out.println("我的爸爸");body();System.out.println("啊~ 这就是我的爸爸~");}abstract void body();
}

但其实业务代码中一般不会这么写死,因为万一你写的模板确实不适合人家的业务需求呢,那岂不是坏大事了。

相关文章:

【进阶篇-Day3:JAVA接口新特性、代码块、内部类、Lambda表达式、组件等的介绍】

目录 1、接口新特性1.1 JDK8的新特性1.2 JDK9的新特性 2、代码块2.1 代码块的定义2.2 代码块的分类 3、内部类3.1 内部类的定义3.2 内部类成员访问3.3 学习内部类的原因3.4 内部类的分类3.4.1 成员内部类3.4.2 静态内部类3.4.3 局部内部类3.4.4 匿名内部类(1&#x…...

72-UDP协议工作原理及实战

#ifndef UDPCOMM_H #define UDPCOMM_H#include <QMainWindow> #include <QUdpSocket> // 用于发送和接收UDP数据报 #include <QtNetwork>QT_BEGIN_NAMESPACE namespace Ui { class udpComm; } QT_END_NAMESPACEclass udpComm : public QMainWindow {Q_OBJECT…...

数据结构——顺序表的实现

数据结构——顺序表的实现 一 关于顺序表的简单知识二 动态顺序表 一 关于顺序表的简单知识 1.顺序表的底层结构是数组&#xff0c;在数组的基础上增加了增&#xff0c;删&#xff0c;查&#xff0c;改等方法。 2.顺序表的分类&#xff1a;静态顺序表和动态顺序表 静态顺序表的…...

【牛客面试必刷TOP101】Day33.BM70 兑换零钱(一)和BM71 最长上升子序列(一)

文章目录 前言一、BM70 兑换零钱(一)题目描述题目解析二、BM71 最长上升子序列(一)题目描述题目解析总结 前言 一、BM70 兑换零钱(一) 题目描述 描述&#xff1a; 给定数组arr&#xff0c;arr中所有的值都为正整数且不重复。每个值代表一种面值的货币&#xff0c;每种面值的货币…...

重构与优化-优化函数调用(5)

Rename Method Rename Method(“函数改名”),它的核心目标是通过修改方法的名称来更好地反映其功能,提高代码的可读性和维护性。这项重构不仅适用于Java,也同样适用于其他面向对象的编程语言。下面是进行Rename Method重构时的一些关键点和步骤: 关键目的 提升代码清晰…...

6月18日(周二)A股行总结:A股震荡收涨,车路云概念全日强势,10年、30年国债期货齐创新高

车路云概念股发力上涨&#xff0c;中海达、华铭智能等多股20CM涨停。半导体板块走强&#xff0c;中芯国际港股上涨近&#xff13;% 。白酒板块下跌&#xff0c;贵州茅台跌1.3% 。30年期及10年期国债期货主力合约均创上市以来新高。 周二&#xff0c;A股全日窄幅震荡 沪指收涨0…...

今年的618,似乎很平淡!

电商平台取消预售制度的第一个大促&#xff0c;快递业表现如何&#xff1f; 今年的618大促与往年有些不同&#xff0c;自4月起&#xff0c;天猫、京东、快手等主流平台相继官宣取消预售&#xff0c;打出“现货开卖”标签&#xff0c;这意味着消费者不用再被“烧脑”的优惠计算…...

嵌入式中间件_3.嵌入式中间件的一般架构

根据嵌入式中间件的不同类型和其应用对象的不同&#xff0c;其架构也有所不同&#xff0c;通常嵌入式中间件没有统一的架构&#xff0c;这里仅仅列举两种中间件架构。 1.消息中间件 1.1消息中间件原理架构 消息中间件是消息传输过程中保存消息的一种容器。它将消息从它的源中…...

Java基础 - 练习(二)打印菱形

Java基础练习 打印菱形&#xff0c;先上代码&#xff1a; // 方法一&#xff1a;基础&#xff0c;好理解 public static void diamond() {//控制行数for (int i 1; i < 4; i) {//空格的个数for (int k 1; k < 4 - i; k) {System.out.print(" ");}//控制星星…...

链表OJ--超详细解析

链表OJ 文章目录 链表OJ1. 反转链表2. 返回K值3. 链表的中间节点4. 回文链表5. 相交链表6. 带环链表6.1 为什么一定会相遇&#xff0c;有没有可能会错过&#xff0c;或者出现永远追不上的情况&#xff0c;请证明6.2 slow一次走一步&#xff0c;fast如果一次走3步&#xff0c;走…...

JavaFX 分隔符

Separator类表示水平或垂直分隔线。它分割元素&#xff0c;不产生任何动作。 我们可以设计风格&#xff0c;应用视觉效果&#xff0c;并为分隔符设置动画。 默认情况下&#xff0c;分隔符是水平的。我们可以使用setOrientation方法改变它的方向。 Separator类扩展了Node类。…...

mysql安装配置教程(Linux+Windows)

mysql安装配置教程&#xff08;LinuxWindows&#xff09; 文章目录 mysql安装配置教程&#xff08;LinuxWindows&#xff09;摘要在 Linux 上安装和配置 MySQL1. 安装 MySQLUbuntu/DebianCentOS/RHEL 2. 配置 MySQL初始化 MySQL登录 MySQL创建数据库和用户配置 MySQL 文件 3. 测…...

MySQL数据库与基本操作(增删改查)

一、数据库的基本概念 数据库要学习的四个基本概念&#xff0c;主要是&#xff1a;数据、数据库系统、数据库、数据管理系统。数据&#xff08;Date&#xff09;是描述事物的记录&#xff0c;数据库系统&#xff08;DBS&#xff09;&#xff0c;数据库管理系统&#xff08;DBMS…...

【学习总结】SpringBoot中使用单例模式+ScheduledExecutorService实现异步多线程任务(若依源码学习)

最近在学习若依这个开源项目&#xff0c;发现他记录登录日志的时候使用了异步线程去记录日志&#xff0c;觉得这个方案也挺不错的&#xff0c;在此学习记录下来&#xff0c;以后在工作中也能提供一种思路&#xff0c;其他小伙伴如果有觉得不错的方案也可以在评论区里留言&#…...

shell脚本编程(概念、编程和语句)

一、shell脚本概述 1、shell脚本概念 Shell 脚本是利用 shell 的功能所写的一个程序。这个程序是使用纯文本文件&#xff0c;将一些 shell 的语法与命令&#xff08;含外部命令&#xff09;写在里面&#xff0c;搭配正则表达式、管道命令与数据流重定向等功能。 2、Shell 脚…...

设置角色运动的动画

(1) 打开Assets-UnityTechnologies-Animation-Animators&#xff0c;Create-Animation-Controller,命名为JohnLemon (2) 打开JohnLemon&#xff0c;出现下图 (3) 依次将Assets-UnityTechnologies-Animation-Animation中的JohnIdle和JohnWalk拖放到Base Layer窗口中 (4) 右击Idl…...

OKR:2024年目标和关键成果常见问题

什么是目标和关键结果&#xff08;OKR&#xff09;&#xff1f; 目标和关键结果&#xff08;#OKR#&#xff09;是一种由结果驱动的目标制定方法。在企业中&#xff0c;OKR经常被用来指导基于结果的成功。使用结果而不是任务作为驱动力&#xff0c;OKRs 鼓励通过度量指标对实现成…...

轻量级 ioc/aop 框架 loveqq 1.0 发布,完全替换掉若依底层 spring 及其 starter

loveqq-framework 轻量级 ioc/aop 框架&#xff0c;比 spring 更强大的条件注解推断&#xff0c;打包后支持 jar index 启动。 本次更新&#xff1a; 正式更名为&#xff1a;loveqq-famework 新增&#xff1a;loveqq-boot-starter-mybatis 新增&#xff1a;loveqq-boot-start…...

【递归、搜索与回溯】DFS解决FloodFill算法

一、经验总结 之前我们已经研究过了BFS解决FloodFill算法&#xff1a;【优选算法】BFS解决FloodFill算法-CSDN博客 DFS只是遍历顺序发生了变化&#xff0c;其他需要注意的点大差不差。 二、相关编程题 2.1 图像渲染 题目链接 733. 图像渲染 - 力扣&#xff08;LeetCode&am…...

【Spine学习12】之 事件帧

1、新建事件帧&#xff1a; 2、选择第8s的攻击帧&#xff0c;点击第一步新建的attack事件帧前面的钥匙 这样每次动作到8s的时候会自动跳出事件帧提示 这个文字实际动画不会显示 事件是动画过程中所发生情况的触发器。 给程序员识别的...

AlwaysOnTop窗口置顶工具:3大突破性功能重塑你的多任务工作流

AlwaysOnTop窗口置顶工具&#xff1a;3大突破性功能重塑你的多任务工作流 【免费下载链接】AlwaysOnTop Make a Windows application always run on top 项目地址: https://gitcode.com/gh_mirrors/al/AlwaysOnTop 在当今数字化工作环境中&#xff0c;我们每天平均需要切…...

如何在ComfyUI中玩转WanVideo:从零到一的视频生成魔法

如何在ComfyUI中玩转WanVideo&#xff1a;从零到一的视频生成魔法 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 你是否曾经想过&#xff0c;如果能像搭积木一样轻松创作视频该有多好&#xff…...

如何用WeChatMsg实现微信聊天记录的永久保存与深度分析

如何用WeChatMsg实现微信聊天记录的永久保存与深度分析 【免费下载链接】WeChatMsg 提取微信聊天记录&#xff0c;将其导出成HTML、Word、CSV文档永久保存&#xff0c;对聊天记录进行分析生成年度聊天报告 项目地址: https://gitcode.com/GitHub_Trending/we/WeChatMsg …...

致所有嵌入式学习者:一些比代码更重要的东西

文 / 一只会飞的猫 本文已经加入原创侵权保护&#xff0c;商业行为&#xff0c;禁止任何形式转载&#xff0c;违者必究。 文章所在专栏&#xff1a;嵌入式入行认知指南—芯片老兵带你打破学习信息差 文章目录1 为什么我要写这个专栏2 在这个专栏里&#xff0c;你会了解到什么&a…...

OpenClaw+nanobot自动化测试:24小时监控网站可用性

OpenClawnanobot自动化测试&#xff1a;24小时监控网站可用性 1. 为什么需要自动化网站监控 作为个人站长&#xff0c;我经常遇到这样的困扰&#xff1a;半夜网站突然宕机&#xff0c;直到第二天收到用户反馈才发现问题。传统监控方案要么价格昂贵&#xff0c;要么配置复杂&a…...

[Android S] 深入解析statsd的log统计机制与实现

1. 认识Android系统中的statsd statsd是Android系统中一个非常重要的后台服务&#xff0c;它的主要职责是收集系统和应用的各类统计信息。你可能不知道&#xff0c;每次你在Android设备上执行操作时&#xff0c;statsd都在默默记录着各种数据。这些数据对于系统优化、性能分析和…...

突破安卓视频解析壁垒:LAMDA框架实现流媒体捕获与自动化提取全指南

突破安卓视频解析壁垒&#xff1a;LAMDA框架实现流媒体捕获与自动化提取全指南 【免费下载链接】lamda ⚡️ Android reverse engineering & automation framework | 史上最强安卓抓包/逆向/HOOK & 云手机/远程桌面/自动化辅助框架&#xff0c;你的工作从未如此简单快捷…...

OpenClaw+GLM-4.7-Flash智能书签:自动归档网页内容

OpenClawGLM-4.7-Flash智能书签&#xff1a;自动归档网页内容 1. 为什么需要智能书签管理 作为一个每天需要浏览大量技术文档和行业资讯的开发者&#xff0c;我发现自己陷入了"收藏即遗忘"的困境。Chrome书签栏里堆满了未分类的链接&#xff0c;Evernote里塞着杂乱…...

CCMusic跨平台部署指南:Windows/Linux/macOS全适配

CCMusic跨平台部署指南&#xff1a;Windows/Linux/macOS全适配 音乐风格识别从未如此简单——无论你用哪种电脑系统 1. 开篇&#xff1a;为什么需要跨平台部署方案 还在为音乐风格分类工具的安装头疼吗&#xff1f;不同的操作系统、不同的环境配置、复杂的依赖关系...这些麻烦…...

Phi-3 Forest Lab实战案例:用128K上下文处理整本API文档并生成测试用例

Phi-3 Forest Lab实战案例&#xff1a;用128K上下文处理整本API文档并生成测试用例 1. 项目背景与价值 在现代软件开发中&#xff0c;API文档的处理和测试用例生成是两项耗时且容易出错的工作。传统方法需要工程师手动阅读大量文档并编写测试代码&#xff0c;效率低下且难以保…...