首页 > 编程语言 >框架(Java相关)基础

框架(Java相关)基础

时间:2024-05-23 21:41:13浏览次数:28  
标签:Java String 框架 System public println 相关 Class out

框架前置知识

时间: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五种的创建方式

 package 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));
    }
 }
 

标签:Java,String,框架,System,public,println,相关,Class,out
From: https://www.cnblogs.com/lmyfi/p/18209425

相关文章

  • 计算机Java项目|基于springboot的网上购物商城系统研发
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互......
  • 计算机Java项目|基于Springboot甘肃非物质文化网站的设计与开发
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互......
  • 计算机Java项目|Springboot教师工作量管理系统
    作者主页:编程指南针作者简介:Java领域优质创作者、CSDN博客专家、CSDN内容合伙人、掘金特邀作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互......
  • Pytorch-01 框架简介
    智能框架概述人工智能框架是一种软件工具,用于帮助开发人员构建和训练人工智能模型。这些框架提供了各种功能,如定义神经网络结构、优化算法、自动求导等,使得开发人员可以更轻松地实现各种人工智能任务。通过使用人工智能框架,开发人员可以更快速地开发和部署机器学习和深度学......
  • 【Java学习】第19节:时间类(Date、Calendar、SimpleDateFormat)、包装类
    目录第一章Date类1.1Date概述1.2Date常用方法第二章SimpleDateFormat类2.1构造方法2.2格式规则2.3常用方法2.4练习1(初恋女友的出生日期)2.5练习2(秒杀活动)第三章Calendar类3.1概述3.2常用方法3.3get方法示例3.4set方法示例:3.5add方法示例:第......
  • js逆向系列1.1、JavaScript基础语法
    JS逆向爬虫语法初阶dy:a_b,xhs:x-s等有需要联系。v:a2247429407【1】JavaScript初识JavaScript是一种用于在客户端(即用户的浏览器)上运行的编程语言。它是一种脚本语言,可以直接嵌入到HTML页面中,并由浏览器解释和执行。在客户端环境中,JavaScript可以与用户交互,操作和修......
  • [Java]Socket套接字(网络编程入门)
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/18032037出自【进步*于辰的博客】参考笔记二,P61。注:“一对一”、“多对多”是相对于Socket而言,而非服务端/客户端类的个数。目录1、概述2、二种聊天模式2.1“一对一......
  • DdddOcr 带带弟弟OCR通用验证码和 JAVA调用
    本文主要参考DdddOcr发布的最新版本启动服务端,以及JAVA如何和服务端对接。DdddOcr,其由作者与kerlomz共同合作完成,通过大批量生成随机数据后进行深度网络训练,本身并非针对任何一家验证码厂商而制作,本库使用效果完全靠玄学,可能可以识别,可能不能识别。DdddOcr、最简依赖......
  • solidworks给AD设计PCB边框相关细节
    1.创建零件工程,设计一个边框保存为DXF格式2.在AD里面PCB窗口选择导入DXF文件先选中一条边框再tab(全选),再按DSD,就是自己想要的PCB板。接下来介绍一些细节:定位原点;EOS,选择左下角为原点......
  • [Java]反射
    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)https://www.cnblogs.com/cnb-yuchen/p/17960654出自【进步*于辰的博客】参考笔记二,P75.3;笔记三,P15.2、P43.2、P44.2、P64.3、P69.1。1、什么是“反射”?关于类加载,详述可查阅博文《[Java]知识点》中的【类加载......