框架前置知识
时间:2024-05-20 星期一
学习内容
-
Maven构建工具
-
Maven的核心特性
-
Maven的依赖管理
-
Maven的工程打包
-
-
工厂模式
-
设计模式
-
工厂模式
-
工厂模式的引用场景
-
-
反射机制
-
反射及作用
-
反射的四个核心类
-
反射在项目中的应用
-
-
Lambda表达式
-
Lambda语法
-
函数式编程
-
Stream流式处理
-
Maven构建工具
Maven简介
-
Maven是项目管理工具,对软件项目提供构建与依赖管理-
-
Maven是Apache下的Java开源项目
-
Maven为Java项目提供了统一的管理方式
Maven的核心特性
-
项目设置遵循统一的规则,保证不同开发环境的兼容性
-
强大的依赖管理,项目依赖组件自动下载、自动更新
-
可扩展的插件机制,使用简单,功能丰富
Maven项目新建时的各字段含义
-
GroupId:机构或者团队的英文,采用“逆向域名”形式书写
-
ArtifactId:项目名称,说明其用途
-
Version:版本号,一般采用“版本+单词”的形式,例如:1.0.0.RELEASE
Maven工程项目文件结构
Maven依赖管理
-
Maven利用dependency(依赖)自动下载、管理第三方Jar
-
在pom.xml文件中配置项目依赖的第三方组件
-
maven自动将依赖从远程仓库下载至本地仓库,并在工程中引用
本地仓库与中央仓库
Maven通过配置文件pom.xml中内容去下载指定的依赖,首先maven首先去本地仓库寻找,找不到再去中央(远程)仓库找并下载。
由于Maven的默认仓库源是国外的,所以一般下载依赖会比较慢,所以可以修改它的下载仓库源如国内的阿里源(maven.aliyun.com)等
Maven常用命令
设计模式(工厂模式)
-
工厂模式是设计模式的一种,设计模式是前辈总结的设计经验
-
设计模式的分类
-
创建型模式
-
结构型模式
-
行为型模式
-
-
-
设计模式的目标是代码更容易理解,更容易维护
-
通过设计模式可以让代码更加可靠
工厂模式
-
工厂模式用于隐藏创建对象的细节
-
工厂模式核心:工厂类(factory)
-
工厂模式可细分为简单工厂、工厂方法与抽象工厂
反射机制
反射Reflect
-
反射(Reflect)是在运行时动态访问类与对象的技术
-
反射时JDK1.2版本后的高级特性,隶属于java.lang.reflect
-
大多数Java框架都基于反射实现参数配置、动态注入等特性
/**
* 传统的创建对象方式
*/
public static void case1(){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入计算类名:");
String op = scanner.next();
System.out.print("请输入a:");
int a = scanner.nextInt();
System.out.print("请输入b:");
int b = scanner.nextInt();
MathOperation mathOperation = null;
if(op.equals("Addition")){
mathOperation = new Addition();
}else if(op.equals("Subtraction")) {
mathOperation = new Subtraction();
}else if(op.equals("Multiplication")){
mathOperation = new Multiplication();
}else{
System.out.println("无效的计算类");
return;
}
float result = mathOperation.operate(a, b);
System.out.println(result);
}
/**
* 利用反射创建对象更加灵活
*/
public static void case2(){
Scanner scanner = new Scanner(System.in);
System.out.print("请输入计算类名:");
String op = scanner.next();
System.out.print("请输入a:");
int a = scanner.nextInt();
System.out.print("请输入b:");
int b = scanner.nextInt();
MathOperation mathOperation = null;
try {
mathOperation = (MathOperation) Class.forName("com.imooc.reflect." + op).newInstance();
}catch(Exception e){
System.out.println("无效的计算类");
return;
}
float result = mathOperation.operate(a, b);
System.out.println(result);
}
反射的核心类
-
Class类
-
Constructor构造方法类
-
Method方法类
-
Field成员变量类
Class类
-
Class是JVM中代表“类和接口”的类
-
Class对象具体包含了某个特定类的结构信息
-
通过Class对象可获取对应类的构造方法/方法/成员变量
Class核心方法
-
Class.forName(类),静态方法,用于获取指定Class对象
-
classObj.newInstance(),通过默认构造方法创建新的对象
Class employee = Class.forName("com.imooc.entity.Employee");//获取employee类
Employee empInstance = (Employee) employee.newInstance();//获取employee实例对象
-
classObj.getConstructor(),获得指定的public修饰构造方法Constructor对象
-
Constructor构造方法类
-
Constructor类是对Java类中的构造方法的抽象
-
Constructor对象包含了具体类的某个具体构造方法的声明
-
通过Constructor对象调用带参构造方法创建对象
-
-
employeeClass = Class.forName("com.imooc.entity.Employee");
Constructor constructor = employeeClass.getConstructor(new Class[]{
Integer.class,String.class,Float.class,String.class
});//调用带参构造函数
Employee employee = (Employee) constructor.newInstance(new Object[]{
3033,"里尔",5000f,"研发部"
});//获取带参构造函数实例
System.out.println(employee);
-
-
classObj.getMethod(),获取指定的public修改方法Method对象
-
methodObj.invoke(),调用指定对象的对应方法
-
Method方法类
-
Method对象指代某个类中的方法的描述
-
Method对象使用classObj.getMethod()方法获取
-
通过Method对象调用指定对象的对应方法
-
try {
Class employeeClass = Class.forName("com.imooc.reflect.entity.Employee");
Constructor constructor = employeeClass.getConstructor(new Class[]{
Integer.class,String.class,Float.class,String.class
});
Employee employee = (Employee) constructor.newInstance(new Object[]{3099,"里尔",5000f,"研发部"});
//调用方法类核心方法
Method updateSalaryMethod = employeeClass.getMethod("updateSalary", new Class[]{
Float.class});//获取指定方法,调用参数包括:方法名,参数类属性名
Employee employee1 = (Employee) updateSalaryMethod.invoke(employee,new Object[]{1000f});//调用执行对应实例对象的方法,调用参数包括:方法位于的实例对象,方法所需参数值
System.out.println(employee1);
} catch (Exception e) {
e.printStackTrace();
}
-
-
-
classObj.getField(),获取指定的public修改成员变量Field对象
-
Field成员变量类
-
Field对应某个特具体类中的成员变量的声明
-
Field对象使用classObj.getField()方法获取
-
通过Field对象可为某对象成员变量赋值/取值
-
field.set(),为某对象指定成员变量赋值
-
field.get()获取某指定成员变量数值
-
-
try {
Class employeeClass = Class.forName("com.imooc.reflect.entity.Employee");
Constructor constructor = employeeClass.getConstructor(new Class[]{
Integer.class,String.class,Float.class,String.class
});
Employee employee = (Employee) constructor.newInstance(new Object[]{
3099,"里尔",5000f,"研发部"
});
Field enameField = employeeClass.getField("ename");
String ename = (String) enameField.get(employee);//获取public属性的ename的值
System.out.println(ename);
enameField.set(employee,"你好");
String ename1 = (String) enameField.get(employee);//获取public属性的ename的值
System.out.println("调用set方法后的ename值:\n"+ename1);
} catch (Exception e) {
e.printStackTrace();
}
-
-
getDeclared系列方法
-
getDeclaredConstructor(s)|Method(s)|Field(s)获取对应对象
-
getConstructor(s)|Method(s)|Field(s)只能获取public对象
-
访问非作用域内构造方法、方法、成员变量,会抛出异常
-
Class employeeClass = Class.forName("com.imooc.reflect.entity.Employee");
Constructor constructor = employeeClass.getConstructor(new Class[]{
Integer.class,String.class,Float.class,String.class
});
Employee employee = (Employee) constructor.newInstance(new Object[]{
3099,"里尔",5000f,"研发部"
});
Field[] fields = employeeClass.getDeclaredFields();//获取所有属性包括private和public
//打印对象属性值
for (Field field : fields){
// System.out.println(field.getName());
if (field.getModifiers() == 1){//public修饰属性
Object val = field.get(employee);
System.out.println(field.getName() + "." + val);
}else if (field.getModifiers() == 2){ //获取private修饰的属性值
String methodName = "get" + field.getName().substring(0,1).toUpperCase() + field.getName().substring(1);//属性get方法名
Method getMethod = employeeClass.getMethod(methodName);
Object ret = getMethod.invoke(employee);
System.out.println(field.getName() + ":" + ret);
}
}
-
-
时间:2024-05-23 星期四
Lambda表达式
学习内容:Lambda语法、基于Lambda实现函数式编程、Stream流式处理
Lambda表示式是什么?
-
JDK8开始支持Lambda表达式,用来让程序编写更优雅
-
利用Lambda可以更简洁的实现匿名内部类与函数声明与调用
-
基于Lambda提供stream流式处理极大简化对集合的操作
//传统代码
List<String> names = Arrays.asList("peter","anna","mike","xenia");
System.out.println(names);
//实现集合排序--传统方法
Collections.sort(names, new Comparator<String>() {
@Override
public int compare(String a, String b) {
return b.compareTo(a);
}
});
System.out.println(names.toString());
//使用Lambda表达式
//通过lambda表达式简化匿名类的编写
Collections.sort(names,(a,b)->b.compareTo(a));
System.out.println(names);
Lambda语法格式
格式:(参数列表)->实现语句
参数列表:使用逗号分隔参数(Integer a,Integer b),参数类型可省略(a,b),单参数括号可省略(a)
实现语句:单行直接写,多行用{}包括
//MathOperation接口类
public interface MathOperation {
Float operate(Integer a, Integer b);
}//使用不同参数形式的Lambda使用
//1.标准Lambda使用方式
MathOperation addition = (Integer a, Integer b)->{
System.out.println("加法运算");
return a+b+0f;//加0f是因为,MathOperation接口中包含的方法的所需的返回值是Float类型
};
System.out.println(addition.operate(1,2));
//2.Lambda允许忽略参数类型
MathOperation substraction = (a,b)->{
System.out.println("减法运算");
return a-b+0f;
};
System.out.println(substraction.operate(3,2));
//3.单行实现代码可以省略大括号和return
MathOperation multiplication = (a,b)->a*b+0f;
System.out.println("乘法运算");
System.out.println(multiplication.operate(3,2));
函数式编程
-
函数式编程是基于函数式接口并使用lambda表达的编程方式
-
函数式编程理念是将代码作为可重用代入到程序运行中
-
函数式编程强调"你想做什么",而不是“你想怎么做”
函数式接口
-
函数式接口是有且只有一个抽象方法的接口
-
Java中拥有大量函数式接口,如java.lang.Runnable
-
JDK8后提供了一系列的函数式接口,位于java.util.function
JDK8常用函数式接口
-
Consumer<T>,对应有一个输入参数无输出的功能代码
-
Function<T,R>,对应有一个输入参数且需要返回数据的功能代码
-
Predicate<T>,用于条件判断,固定返回布尔值
函数式接口Predicate
-
Predicate是新增的函数式接口,位于java.util.function
-
Predicate用于测试传入的数据是否满足判断要求
-
Predicate接口需要实现test()方法进行逻辑判断
package com.imooc.lambda.sample;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Predicate;
/**
* 理解函数式编程
* Predicate函数式接口的使用方法
*/
public class PredicateSample {
public static void main(String[] args) {
//判断是否小于4
Predicate<Integer> predicate = n -> n<4;
boolean result = predicate.test(10);
System.out.println(result);
List<Integer> nums = Arrays.asList(1,2,3,4,5,6,7);
filter(nums,n->n%2==1);//取所有奇数
filter(nums,n->n%2==0);//取所有偶数
filter(nums,n->n>5 && n%2==0);//取所有大于5的偶数
}
public static void filter(List<Integer> list, Predicate<Integer> predicate){
for (Integer num:list){
if (predicate.test(num)){
System.out.print(num+ " ");
}
}
System.out.println();
}
}
Stream流式处理
-
Stream流式处理是建立在Lambda基础上的多数据处理技术
-
Stream对集合数据处理进行高度抽象,极大简化代码量
-
Stream可对集合进行迭代,去重,筛选,排序,聚合等一系列处理
Stream常用方法
-
forEach,循环遍历
-
map,map方法用于映射每个元素到对应的结果
-
filter,用于设置条件过滤出元素
-
limit,方法用于获取指定数量的流
-
sorted,方法用于对流进行排序
-
Collectors,Collectors类实现将流转换成集合和聚合元素
Stream五种的创建方式
标签:Java,String,框架,System,public,println,相关,Class,out From: https://www.cnblogs.com/lmyfi/p/18209425package com.imooc.stream;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.stream.IntStream;
import java.util.stream.Stream;
/**
* Stream流对象的五种创建方式
*/
public class StreamGenerator {
//1.基于数组进行创建
@Test
public void generator1(){
String[] arr = {"Lily", "Andy", "Jackson", "Smith"};
Stream<String> stream = Stream.of(arr);
stream.forEach(s-> System.out.println(s));
}
//2.基于集合进行创建
@Test
public void generator2(){
List<String> list = new ArrayList<>();
list.add("Lily");
list.add("Andy");
list.add("Jackson");
list.add("Smith");
Stream<String> stream = list.stream();
stream.forEach(s-> System.out.println(s));
}
//3.利用generate方法创建无限长度流
@Test
public void generator3(){
Stream<Integer> stream = Stream.generate(() -> new Random().nextInt(10000));
stream.limit(10).forEach(i-> System.out.println(i));
}
//4.基于迭代器创建流
@Test
public void generator4(){
Stream<Integer> stream = Stream.iterate(1,n->n+1);
stream.limit(10).forEach(i-> System.out.println(i));
}
//5.基于字符序列创建流
@Test
public void generator5(){
String str = "abcdefg我的";
IntStream stream = str.chars();//生成字符串中每一个字符的ASCII码值
stream.forEach(c -> System.out.println(c));
}
}