软件设计之Java入门视频(22)

news2024/9/24 3:26:49

软件设计之Java入门视频(22)

视频教程来自B站尚硅谷:

尚硅谷Java入门视频教程,宋红康java基础视频
相关文件资料(百度网盘)
提取密码:8op3
idea 下载可以关注 软件管家 公众号

学习内容:

该视频共分为1-717部分
本次内容涉及 660-717(后续Java9、10、11新特性就不一一赘述)
在写代码时,总是需要来回切换界面来看代码要求,这里推荐Snipaste,可以把截图以窗口形式放在屏幕上
记录内容:

  1. 静态代理
  2. 动态代理
  3. Lambda表达式
  4. 函数式接口
  5. 方法引用
  6. Stream API

1、静态代理

interface  ClothFactory{
    void produceCloth();
}
//代理类
class  ProxyClothFactory implements ClothFactory{

    private ClothFactory factory;//用被代理对象进行实例化

    public ProxyClothFactory(ClothFactory factory) {
        this.factory = factory;
    }

    @Override
    public void produceCloth() {
        System.out.println("代理工厂做准备工作");
        factory.produceCloth();
        System.out.println("代理工厂做后续工作");
    }
}
//被代理类
class NikeClothFactory implements ClothFactory{

    @Override
    public void produceCloth() {
        System.out.println("Nike工厂生产运动服");
    }
}
public class StaticProxyTest {
    public static void main(String[] args) {
        //创建被代理类对象
        NikeClothFactory ncf = new NikeClothFactory();
        //创建代理类对象
        ProxyClothFactory pcf = new ProxyClothFactory(ncf);

        pcf.produceCloth();
        //代理工厂做准备工作
        //Nike工厂生产运动服
        //代理工厂做后续工作
    }
}

2、动态代理

interface Human{
    String getBelief();
    void eat(String food);

}
//被代理类
class SuperMan implements Human{

    @Override
    public String getBelief() {
        return "I believe";
    }

    @Override
    public void eat(String food) {
        System.out.println("我喜欢吃" + food);
    }
}
/*
* 想要实现动态代理,需要解决的问题
* 问题1:如何根据加载到内存中的被代理类,动态的创建一个代理类及其对象
* 问题2:当通过代理类的对象调用方法时,如何动态的去调用被代理类中的同名方法*/
class  ProxyFactory{
    //调用此方法,返回一个代理类的对象,解决问题1
    public static Object getProxyInstance(Object obj){//obj:被代理类的对象
        MyInvocationHandler handler =  new MyInvocationHandler();
        handler.bind(obj);
        return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(),handler);
    }
}
class MyInvocationHandler implements InvocationHandler{

    private Object obj;//需要使用被代理类对象进行幅值
    public void bind(Object obj){
        this.obj = obj;
    }
    //通过代理类的对象,调用方法a时,会自动调用如下方法:invoke()
    //将被代理类要执行的方法a的功能声明在invoke()中
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //method:即为代理类对象调用的方法,此方法也就作为了被代理类对象要调用的方法
        //obj:被代理类对象
        Object returnValue = method.invoke(obj, args);
        return returnValue;
    }
}
public class ProxyTest {
    public static void main(String[] args) {
        SuperMan superMan = new SuperMan();
        //proxyInstance代理类的对象
        Human proxyInstance = (Human) ProxyFactory.getProxyInstance(superMan);
        proxyInstance.eat("四川麻辣");//我喜欢吃四川麻辣
    }
}

3、Lambda表达式

public class LambdaTest {
    //语法格式一:无参,无返回值
    @Test
    public void test(){
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("输出");
            }
        };
        r1.run();

        System.out.println("***********");
        Runnable r2 = () -> {System.out.println("输出2");};
        r2.run();
    }
    @Test
    //语法格式二:Lambda 需要一个参数,但是没有返回值。
    public void test1(){
        Consumer<String> con = new Consumer<String>(){
            @Override
            public void accept(String s){
                System.out.println(s);
            }
        };
        con.accept("你好");
        System.out.println("********");
        Consumer<String> con1 = (String s) -> {System.out.println(s);};
    }
    @Test
    //语法格式三:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
    public void test3(){
        Consumer<String> con = new Consumer<String>(){
            @Override
            public void accept(String s){
                System.out.println(s);
            }
        };
        con.accept("你好");
        System.out.println("********");
        Consumer<String> con1 = (s) -> {System.out.println(s);};
    }
    @Test
    //语法格式四:Lambda 若只需要一个参数时,参数的小括号可以省略
    public void test4(){
        Consumer<String> con = new Consumer<String>(){
            @Override
            public void accept(String s){
                System.out.println(s);
            }
        };
        con.accept("你好");
        System.out.println("********");
        Consumer<String> con1 = s -> {System.out.println(s);};
    }
    @Test
    //语法格式五:Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
    public void test5(){
        Comparator<Integer> com1 = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                System.out.println(o1);
                System.out.println(o2);
                return o1.compareTo(o2);
            }
        };
        System.out.println("**********");
        Comparator<Integer> com2 = (o1,o2) -> {
            System.out.println(o1);
            System.out.println(o2);
            return o1.compareTo(o2);
        };
        System.out.println(com2.compare(12,6));
    }
    @Test
    //语法格式六:当 Lambda 体只有一条语句时,return 与大括号若有,都可以省略
    public void test6(){
        Comparator<Integer> com1 = (o1,o2) -> o1.compareTo(o2);;
        System.out.println(com1.compare(12,6));
    }
}

4、函数式接口

在这里插入图片描述

5、方法引用

使用情景:当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用
方法引用本身上就是Lamda表达式,即也是函数式接口的实例
具体分为三种情况
1) 对象 :: 非静态方法
2)类::静态方法
3)类::非静态方法


public class LambdaTest {
    //情况一: 对象::实例方法
    //Consumer中的void accept(T t)
    //PrintStream中的void println(T t)
    @Test
    public void test(){
       Consumer<String> con1 = str -> System.out.println(str);
       con1.accept("北京");

        System.out.println("**********");
        PrintStream ps = System.out;
        Consumer<String> con2 = ps::println;
        con2.accept("beijing");
    }
    //
    @Test
    //情况二: 类::静态方法
    //Comparator 中的int compare(T t1, T t2)
    //Integer 中的int compare(T t1, T t2)
    public void test1(){
        Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);
        System.out.println(com1.compare(12,13));
        Comparator<Integer> com2 = Integer ::compare;
        System.out.println(com2.compare(12,13));
    }
    @Test
    //情况三: 类::实例方法
    //Comparator中的int compare(T t1,T t2)
    //String 中的int t1.compareTo(t2)
    public void test3(){
        Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);
        System.out.println(com1.compare("abc","def"));
        System.out.println("*********");

        Comparator<String> com2 = String ::compareTo;
        System.out.println(com2.compare("abc","def"));
    }

}

6、Stream API

1、Stream关注的是对数据的运算,与CPU打交道
2、集合关注的是数据的存储,与内存打交道
3、注意点
①Stream 自己不会存储元素。
②Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream
③Stream 操作是延迟执行的。这意味着他们会等到需要结果的时候才执行。

在这里插入图片描述

创建Stream

public class StreamAPITest {
    //创建Stream方式一:通过集合
    @Test
    public void test1(){
        List<Employee> employees = EmployeeData.getEmployees();

        //default Stream<E> stream():返回一个顺序流
        Stream<Employee> stream = employees.stream();
        //default Stream<E> parallelStream():返回一个并行流
        Stream<Employee> employeeStream = employees.parallelStream();
    }
    //创建Stream方式二:通过数组
    @Test
    public void test2(){
        int[] arr = new int[]{1,2,3};
        // 调用Arrays类的static <T> Stream<T> stream(T[] array): 返回一个流
        IntStream stream = Arrays.stream(arr);
        Employee e1 = new Employee(1001,"Tom");
        Employee e2 = new Employee(1002,"Jerry");
        Employee[] arr1 = new Employee[]{e1,e2};
        Stream<Employee> stream1 = Arrays.stream(arr1);
    }
    //创建 Stream方式三:通过Stream的of()
    @Test
    public void test3(){
        Stream<Integer> stream = Stream.of(1,2,3);
    }
}

中间操作:筛选

public class StreamAPITest {
    //创建Stream方式一:通过集合
    @Test
    public void test1() {
        List<Employee> list = EmployeeData.getEmployees();
        //filter(Predicate p)——接收Lambda,从流中排除某些元素
        Stream<Employee>stream = list.stream();
        stream.filter(e -> e.getSalary() > 7000).forEach(System.out ::println);
        System.out.println();

        //limit(long maxSize) 截断流,使其元素不超过给定数量
        list.stream().limit(3).forEach(System.out ::println);
        System.out.println();
        //skip(long n)
        //跳过元素,返回一个扔掉了前 n 个元素的流。若流中元素不足 n 个,则返回一个空流与 limit(n) 互补
        list.stream().skip(3).forEach(System.out ::println);

        //distinct() 筛选,通过流所生成元素的 hashCode() 和 equals() 去除重复元素
        list.add(new Employee(1010,"刘强东",40,8000));
        list.add(new Employee(1010,"刘强东",40,8000));
        list.add(new Employee(1010,"刘强东",40,8000));
        list.stream().distinct().forEach(System.out ::println);
    }

中间操作:映射

 @Test
    public void test2() {
//        map(Function f)接收一个函数作为参数,该函数会被应用到每个元素上,并将其映射成一个新的元素。
        List<String> list = Arrays.asList("aa","bb");
        list.stream().map(str -> str.toUpperCase()).forEach(System.out ::println);
        Stream<Stream<Character>> streamStream = list.stream().map(StreamAPITest::fromStringToStream);
        streamStream.forEach(s ->{
            s.forEach(System.out ::println);
        });
        //flatMap(Function f)接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流
        Stream<Character> characterStream = list.stream().flatMap(StreamAPITest::fromStringToStream);
        characterStream.forEach(System.out::println);
    }
    //将字符串中多个字符构成的集合转换为对应的Stream的实例
    public static Stream<Character> fromStringToStream(String str){
        ArrayList<Character> list = new ArrayList<>();
        for (Character c : str.toCharArray()){
            list.add(c);
        }
        return list.stream();
    }

中间操作:排序

public class StreamAPITest {
    //排序
    @Test
    public void test2() {
        //sorted()——自然排序
        List<Integer> list = Arrays.asList(12, 43, 11, 22, 8, 16);
        list.stream().sorted().forEach(System.out::println);
        //抛异常,原因:Employee没有实现Comparable接口
//        List<Employee> employees = EmployeeData.getEmployees();
//        employees.stream().sorted().forEach(System.out::println);
        //sorted(Comparator com)——定制排序
        List<Employee> employees = EmployeeData.getEmployees();
        employees.stream().sorted((e1,e2) -> {
            return Integer.compare(e1.getAge(),e2.getAge());
        }).forEach(System.out::println);
    }
}

终止操作:匹配与查找

public class StreamAPITest {
    //匹配与查找
    @Test
    public void test2() {
        List<Employee> employees = EmployeeData.getEmployees();
//        allMatch(Predicate p) 检查是否匹配所有元素
        boolean allMatch = employees.stream().allMatch(e ->e.getAge() > 18);
        System.out.println(allMatch);
//        anyMatch(Predicate p) 检查是否至少匹配一个元素
        boolean anyMatch = employees.stream().anyMatch(e ->e.getAge() > 18);
        System.out.println(anyMatch);
//        noneMatch(Predicate p) 检查是否没有匹配所有元素
        boolean noneMatch = employees.stream().noneMatch(e ->e.getAge() > 100);
        System.out.println(noneMatch);
//        findFirst() 返回第一个元素
        Optional<Employee> employee = employees.stream().findFirst();
        System.out.println(employee);
//        forEach(Consumer c) 内部迭代
        employees.stream().forEach(System.out::println);
        //使用集合的遍历操作
        employees.forEach(System.out::println);
    }
}

终止操作:归约

    //归约
    @Test
    public void test2() {
//        reduce(T identity, BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 T
        //计算1-10自然数和
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        Integer sum = list.stream().reduce(0, Integer::sum);
        System.out.println(sum);

//        reduce(BinaryOperator b) 可以将流中元素反复结合起来,得到一个值。返回 Optional<T>
        List<Employee> employees = EmployeeData.getEmployees();
        Stream<Double> salaryStream = employees.stream().map(Employee::getSalary);
        Optional<Double> sumMoney = salaryStream.reduce(Double::sum);
        System.out.println(sumMoney);
    }

终止操作:收集

    //收集
    @Test
    public void test2() {
//        collect(Collector c)将流转换为其他形式。接收一个 Collector接口的实现,用于给Stream中元素做汇总的方法
        List<Employee> employees = EmployeeData.getEmployees();
        List<Employee> employeeList = employees.stream().filter(e -> e.getSalary() > 6000).collect(Collectors.toList());
        employeeList.forEach(System.out::println);

        Set<Employee> employeeSet = employees.stream().filter(e -> e.getSalary() > 6000).collect(Collectors.toSet());
        employeeSet.forEach(System.out::println);
    }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1976344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flask 介绍

Flask 介绍 为什么要学 Flask框架对比设计哲学功能特点适用场景学习曲线总结 Flask 的特点Flask 常用扩展包Flask 的基本组件Flask 的应用场景官方文档官方文档链接文档内容概述学习建议 Flask 是一个使用 Python 编写的轻量级 Web 应用框架。它旨在让 Web 开发变得快速、简单且…

ACl访问控制实验

要求&#xff1a;PC1可以telnet登录r1&#xff0c;不能ping通r1&#xff0c;pc1可以ping通r2&#xff0c;但不能telnet登录r2&#xff0c;pc2的所有限制与pc1相反 实验思路&#xff1a;因为华为的ensp默认允许所有&#xff0c;所以只写拒绝规则就行 rule 5 deny icmp source 19…

只需0.5秒 Stability AI新模型超快生成3D图像

生成式人工智能&#xff08;AI&#xff09;明星初创公司Stability AI 8月发布最新突破性3D模型Stable Fast 3D&#xff0c;将单张图片生成3D图像的速度大幅提升。Stability AI今年3月发布的3D模型SV3D需要多达10分钟生成3D资产&#xff0c;基于TripoSR的新模型Stable Fast 3D完…

【面试官:我看你SQL语句掌握的怎么样?面试SQL语句专题3】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【教程】Python语言的地球科学常见数据—— IMS积雪覆盖数据的处理

将ASCII数据转化为netCDF数据、分析新疆北疆、青藏高原和东北地区气候态积雪分布、分析新疆北疆、青藏高原和东北地区积雪面积变化规律。 美国国家冰雪中心&#xff08;NSIDC&#xff09;从 1997 年 2 月至今的北半球雪盖和海冰的地图。这些数据以 ASCII 文本和 GeoTIFF 格式提…

AIWEB1综合靶场通关教程,从外网打到内网【附靶场环境】

前言 靶场获取后台回【aiweb1】 下载之后设置为nat模式 启动即可&#xff0c;不需要登录 靶机复现 主机发现 访问即可 信息收集robots.txt文件 访问尝试&#xff0c;原来是什么也没有的&#xff0c;404 我们去访问这个上级目录&#xff0c;发现有一个id 注入测试 语法错误&am…

基于Protobuf的RPC

先上UserServer提供服务的函数要求proto文件内容&#xff1a; syntax"proto3"; package fixbug; option cc_generic_servicestrue; message LoginRequest {bytes name1;bytes pwd2; } message LoginResponse {ResultCode result1;bool sucess2; } #调用远程服务的入…

JAVA游戏源码:跑酷|大学生练手项目

学习java朋友们&#xff0c;福利来了&#xff0c;今天小编给大家带来了一款跑酷源码。注意&#xff1a;此源码仅供学习使用!! 源码搭建和讲解 启动main入口&#xff1a; //************************************************************************ // ************完整源码…

AcWing食物链

Q1&#xff1a;怎么判断X和Y是不是同类? A:判断这俩是不是在一个集合中,如果在同一个集合中&#xff0c;那么判断X到祖先节点的距离D[X]和D[Y]到祖先节点的距离是否有D[X]%3D[Y]%3,也就是3同余 若果是&#xff0c;那么是同类。如果X和Y不在一个集合里面&#xff0c;那么把X和Y…

护网总结汇报PPT一键生成,还要啥售前工程师

【文末送&#xff1a;技战法】 干技术的&#xff0c;特别是干安服的&#xff0c;你让我日个站觉得没问题&#xff0c;你让我写个文档我挠挠头&#xff0c;抓抓背也能凑一篇&#xff0c;但是你要让我写个ppt&#xff0c;那我觉得你在为难我。 报告我都写好了&#xff0c;为啥还…

Eclipse Debug 配置

创建和使用 Debug 配置 Eclipse Debug 配置类似于运行配置但它是用于在调试模式下开启应用。 打开 Debug 配置对话框步骤为&#xff1a;Run > Debug Configurations 。 从左侧列表中选择 "Java Application" 选项来选择要调试的 Java 代码。 对话框中的描述信息…

24年电赛——自动行驶小车(H题)MSPM0G3507-编码电机驱动与通用PID

一、编码电机驱动 编码电机的详情可以查看此篇文章&#xff1a; stm32平衡小车--&#xff08;1&#xff09;JGB-520减速电机tb6612&#xff08;附测试代码&#xff09;_jgb520-CSDN博客 简单来说&#xff0c;编码电机的驱动主要是给一个 PWM 和一个正负级就能驱动。PWM 的大小…

AI PC处理器架-低功耗、NPU算力、大模型

AI PC处理器架构变化&#xff1a;ARM低功耗、引入NPU算力、大模型落地端侧 ARM架构以简洁的指令集设计&#xff0c;快速执行每条命令&#xff0c;实现低功耗下的高效性能。其核心理念是节能和效率&#xff0c;为电池驱动设备提供了理想选择。相较之下&#xff0c;x86架构虽指令…

Linux--shell脚本语言—/—<1>

一、shell简介 Shell是一种程序设计语言。作为命令语言&#xff0c;它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令&#xff1b;作为程序设计语言&#xff0c;它定义了各种变量和参数&#xff0c;并提供了许多在高级语言中才具有的控制结构&am…

【practise】大数相加、大数相乘

通常&#xff0c;我们的int、long long类型都有最大的数字上限&#xff0c;也就是说再大了会有溢出问题&#xff0c;那么很大的数字是怎么进行运算的呢&#xff1f; 其中一种方法是把很大的数字转变成字符串存放到string中&#xff0c;然后用代码对字符串进行处理&#xff0c;…

PHP最新可用获取QQ昵称API接口源码_非第三方

PHP最新可用获取QQ昵称API接口源码&#xff0c;运行环境为php7-8都可以&#xff0c;内容为直接调用QQ空间接口 在需要展示QQ昵称处&#xff0c;直接调用以下函数就可以。 例如&#xff1a;get_qq_nick(123456)就会直接输出123456的qq号昵称。 API源码下载&#xff1a;QQ昵称AP…

【C语言】字符函数和字符串函数详解

&#x1f984;个人主页:小米里的大麦-CSDN博客 &#x1f38f;所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html &#x1f381;代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 内容一览 一、strlen …

一拖三无线充底座-带给你极致的便利生活

随着科技的不断进步&#xff0c;无线充电技术已经逐渐渗透到我们日常生活的方方面面&#xff0c;一拖三无线充底座作为其中的佼佼者&#xff0c;以其高效、便捷的特点受到广大用户的青睐。本文将从电磁感应原理、多线圈设计、频率匹配、电能传输、功率分配以及充电管理六个方面…

【Rust日报】终端表格查看工具

[new ver] Tabiew v0.6.1 Tabiew 是一个轻量级的、基于终端的应用程序&#xff0c;用于查看和查询分隔符分隔值格式的文档&#xff0c;例如 CSV 或 TSV 文件。 功能如下&#xff1a; &#x1f4ca; 表格视图: 通过易于导航的表格视图来探索数据。&#x1f50d; 工作表视图: 深入…

深入剖析隐私安全测试:在数字化时代的守护者

大家好&#xff0c;我是一名_全栈_测试开发工程师&#xff0c;已经开源一套【自动化测试框架】和【测试管理平台】&#xff0c;欢迎大家关注我&#xff0c;和我一起【分享测试知识&#xff0c;交流测试技术&#xff0c;趣聊行业热点】。 一、引言 在日新月异的数字化浪潮中&…