1229-方法引用(简化lambda)-stream流-单元测试-单例模式

  • 方法引用
  • stream流
  • 单元测试(junit)
  • 单例模式

方法引用

概念:对特殊的lambda简化的一种语法

使用时机:()-> {lambda体}

特殊的lambda:当lambda体只有1句代码,并且这句代码是在调用一个方法

java中的方法:

构造方法:new 构造方法()
实例方法:对象名.方法名()
类方法(静态方法):类名.方法名()

构造方法的方法引用的语法:类名 :: new(简化lambda调用构造方法)

/*** Dog类*/
public class Dog {  private String name;private Integer age;public Dog() {}public Dog(String name, Integer age) {this.name = name;this.age = age;}
}
/*** 创建Dog对象的接口*/
public interface IFacotryDog {Dog create(String name,Integer age);
}// 创建IFacotryDog对象的方法IFacotryDog ifd = (name,age) -> new Dog(name,age); // 创建函数接口对象Dog d = ifd.create("小可爱", 3);System.out.println(d);// 上面代码中lambda,可以使用构造方法的引用来简化// 创建IFacotryDog对象IFacotryDog ifd2 = Dog::new; // 类名:调用构造方法的类名::newDog d2 = ifd2.create("老可爱", 3);System.out.println(d2);

类方法的方法引用的语法:类名(调用方法存放的类) :: 方法名(要调用的方法名)

/*** 设计一个函数式接口*/
public interface IChangeStringNumber {int change(String number);
}// 创建函数式接口IChangeStringNumber对象IChangeStringNumber  icsn = n -> Integer.parseInt(n);int num = icsn.change("123");System.out.println(num);// 上面代码中lambda是在调用一个类方法,使用类方法引用来简化:类名::方法       IChangeStringNumber icsn2 = Integer::parseInt;icsn2.change("123");

实例方法的方法引用的语法: 对象 :: 方法名 实例方法Get Set方法可以直接用类名调用,这是特殊情况

/*** 设计一个函数式接口*/
public interface IIsAvi {boolean isAvi(String filename);}// 创建IIsAvi对象IIsAvi avi = fn -> fn.endsWith(".avi"); // 创建函数式接口的对象boolean temp = avi.isAvi("蘋蘋在某酒店学习外语.png");System.out.println(temp);// lambda在调用一个实例方法,用实例方法引用来简化:对象::方法名String f = "xxxx.txt";IIsAvi avi2 = f::endsWith; // 实例方法的引用boolean avi1 = avi2.isAvi(f);System.out.println(avi1);// 遍历集合List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);
//        PrintStream ps = System.out;
//        list.forEach(a -> ps.println(a));list.forEach(System.out::println);
小结

方法引用:简化特殊lambda
构造方法引用:类名 :: new
实例的方法的引用:对象名 :: 方法名
类方法的方法引用:类名 :: 方法名

Stream流

概念:Stream是操作数组或者集合的流 (相比IO流,IO流是操作文件流)

注意:Stream只操作数据,不保存数据

  1. 创建Steam流的三种方式:
// 1、创建Stream// 1)、通过Arrays int[] arrs = {1,3,5,7,9};IntStream sm = Arrays.stream(arrs);// 通过arrs数组创建Stream// sm是Stream流对象,sm操作的数据源是arrs// 2)、通过集合对象List<Integer> list = Arrays.asList(1, 2, 3, 4, 56);Stream<Integer> sm2 = list.stream(); // 创建Stream对象// 3)、Stream里面的of方法Stream<Integer> sm3 = Stream.of(1, 2, 3, 4, 5, 6);
  1. 操作流的方法

Stream流的操作步骤:
1)、创建流对象(指定流操作数据源)
2)、操作流:过滤,截取,跳过,去重,排序,切片
3)、结束流:遍历、收集、统计

  • filter(过滤的条件:函数式接口):将不满足条件的数据过滤掉 filter(Predicate<? super T> predicate)`
stream.filter(a -> a % 2 == 0)  // Predicate:断言型的接口  
  • limit(long 数字):截取流里面多个数据,限制流里面显示的条数
stream.limit(2L) // 截取前面2个元素,限制流里面显示的条数
stream.limit(6L) // 截取前面6个元素
  • skip(long n):跳过几条
stream.skip(2L) // 跳过前两条
  • distinct( ) 去重
stream.distinct() // 去除重复数据
  • sorted(Comparator<? super T> comparator):排序 进行排序数据必须实现Comparator
stream.sorted((o1, o2) -> o2 - o1)    // 默认是升序
  • map():切片(给你一种类型,变为另一种类型) map(Function<? super T,? extends R> mapper) 函数型接口
// 将字符串变成int
String str = "12,34,67,5,90,23,4,67,8,9";
String[] split = str.split(",");
Stream<String> stream = Arrays.stream(split); // 创建流// 将字符串变成int
long count = stream.map(Integer::parseInt) // Function,将a由String转换int  由.map(a -> integer.parseInt(a))
  • concat(Stream<? extends T> a, Stream<? extends T> b) 将两个流连在一起
Stream.concat(manlist.stream(), womanList.stream())  
  1. 结束流
  • collect():收集

  • collect(Collectors.toList()); // 将结果收集为一个集和

Stream.collect(Collectors.tolist())  // 将收集的内容变成一个集合
  • count():统计个数
Stream.count  // 统计流中的个数
  1. Stream流的分类

    1、串行流:单线程使用(使用最多)

    2、并行流:多线程使用

    // 创建一个串行流
    List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);Stream<Integer> stream = list.stream();// 创建的串行流stream.forEach(System.out::println);// 并行流
    Stream<Integer> integerStream = list.parallelStream();   方法parallelStream
    integerStream.forEach(System.out::println);
    

小结stream流

小结Stream流
Stream流的分类
1、串行流:单线程使用(使用最多)
2、并行流:多线程使用

1、创建流
Arrays.stream(数组)
集合对象.stream()
Stream.of(可变参数)

2、流操作的方法:
filter()
limit()
skip()
sorted()
distinct()
map()

3、流结束的方法

forEach()
collect()
count()

单元测试

测试:检查代码有没有bug
黑盒测试:不看代码结构,只看结果
白盒测试:必须要看代码
灰盒测试:能看一部分代码
上面的测试是专业人员弄的

单元测试:测试自己写方法,程序员自己测
使用main方法来做,每一个方法只有一个main,测试很不方便
使用单元测试来代替main

/*** 使用单元测试*  需要使用一个@Test的注解*  第一次使用需要导包*/
public class TestCase {@Test // 单元测试的注解// 单元测试的方法,不能有返回值,可以抛出Exceptionpublic void testDemo1() throws Exception {System.out.println("这个单元测试1");}@Testpublic void testDemo2() throws Exception {System.out.println("这个单元测试2");}@Testpublic void testDemo3() throws Exception {System.out.println("这个单元测试3");}// 在测试方法代码冗余(重复的代码)@Before // 在每个测试方法执行之前要执行方法public void before() throws Exception {System.out.println("hello");}@Afterpublic void after() throws  Exception {System.out.println("用来释放锁,关闭流");}}

单例模式

概念:一个类就是只有一个对象,那么就是单例,将一个类设计成单例的方式就是单例模式

怎样将一个类设计为单例

1、私有构造方法
2、在当前类创建对象
3、在该类设计一个类方法,返回这个对象

饿汉模式:

/*** 将Dog设计为单例:也叫(饿汉模式)*/
public class Dog {// 省略属性// 2、创建对象private static Dog d = new Dog(); // 不管这个对象用不用,在内存中存在// 1、私有化构造方法private Dog() {}// 3、设计一个类方法,返回创建的对象public static Dog getInstance() {return d;}
}public class SingletonDemo {public static void main(String[] args) {Dog d1 = Dog.getInstance();System.out.println(d1);Dog d2 = Dog.getInstance();System.out.println(d2);Dog d3 = Dog.getInstance();System.out.println(d3);// 以上指向的都是同一个地址}
}

懒汉模式:**

枚举模式:**

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

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

相关文章

二叉树BFS

前置知识 二叉树节点的定义 二叉树是递归定义的 /*** Definition for a binary tree node.&#xff08;LeetCode&#xff09;*/public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode() {}TreeNode(int val) { this.val val; }TreeNode(int val, TreeNode…

【java爬虫】获取个股详细数据并用echarts展示

前言 前面一篇文章介绍了获取个股数据的方法&#xff0c;本文将会对获取的接口进行一些优化&#xff0c;并且添加查询数据的接口&#xff0c;并且基于后端返回数据编写一个前端页面对数据进行展示。 具体的获取个股数据的接口可以看上一篇文章 【java爬虫】基于springbootjd…

Leetcode的AC指南 —— 双指针:18. 四数之和

摘要&#xff1a; Leetcode的AC指南 —— 双指针&#xff1a;18. 四数之和。题目介绍&#xff1a;给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;…

Android : 使用GestureOverlayView进行手势识别—简单应用

示例图&#xff1a; GestureOverlayView介绍&#xff1a; GestureOverlayView 是 Android 开发中用于识别和显示手势的视图组件。它允许用户在屏幕上绘制手势&#xff0c;并且应用程序可以检测和响应这些手势。以下是关于 GestureOverlayView 的主要特点&#xff1a; 手势识别…

Canal的学习

Canal 基本概念整合SpringBoot 基本概念 Canal是一个基于MySQL数据库增量日志解析&#xff0c;提供增量数据订阅和消费&#xff0c;支持将增量数据投递到下游消费者&#xff08;如Kafka、RocketMQ等&#xff09;或者存储&#xff08;如 Elasticsearch、HBase 等&#xff09;的…

nodejs+vue+微信小程序+python+PHP特困救助供养信息管理系统-计算机毕业设计推荐

通过走访某特困救助供养机构实际情况&#xff0c;整理特困救助供养机构管理的业务流程&#xff0c;分析当前特困救助供养机构管理存在的各种问题&#xff0c;利用软件开发思想对特困救助供养机构特困救助供养机构管理进行系统设计分析。通过服务端程序框架进行设计&#xff0c;…

Python基础语法笔记 tkinter的简单使用

语法 物质 动态类型语言,不需要声明类型 数字 类型int float bool 操作 //整除 **幂 字符串 str1 "Hello python" str2 "world" print(str1 * 3) # 重复输出 print(str1[1]) # 索引访问 print(str1 " " str2) # 拼接 print(str1[2…

MFC - 给系统菜单(About Dialog)发消息

文章目录 MFC - 给系统菜单(About Dialog)发消息概述笔记resource.h菜单的建立菜单项的处理MSDN上关于系统菜单项值的说法END MFC - 给系统菜单(About Dialog)发消息 概述 做了一个对话框程序, 在系统菜单(在程序上面的标题栏右击)中有"关于"的菜单. 这个是程序框架…

java常见面试题:请解释一下Java中的常用分布式框架,如Spring Boot、Dubbo等。

下面我将详细介绍Java中的两个常用分布式框架&#xff1a;Spring Boot和Dubbo。 1. Spring Boot Spring Boot是一个用于创建独立、可运行的、生产级别的Spring应用程序的框架。它简化了Spring应用程序的创建和部署&#xff0c;使得开发人员能够专注于编写业务逻辑&#xff0c…

【MySQL】事务Transaction

1. 事务的概念 事务是什么 在业务逻辑中使用sql&#xff0c;面对一些较复杂的场景&#xff0c;是需要多个sql语句组合起来实现的。如&#xff1a;银行的转账业务&#xff0c;若客户A要转账100元给客户B&#xff0c;就要两条sql&#xff1a;A余额减100&#xff0c;B余额加100&a…

ES6语法(五)封装模块化公共工具函数、引入npm包 ,并上传到npm中进行下载

1. 模块化 模块化是指将一个大的程序文件&#xff0c;拆分为许多小的文件&#xff08;模块&#xff09;&#xff0c;然后将小的文件组合起来。 1.1. 优点 &#xff08;1&#xff09;防止命名冲突 &#xff08;2&#xff09;代码复用 &#xff08;3&#xff09;高维护性 &…

【CFP-专栏2】计算机类SCI优质期刊汇总(含IEEE/Top)

一、计算机区块链类SCI-IEEE 【期刊概况】IF:4.0-5.0, JCR2区&#xff0c;中科院2区&#xff1b; 【大类学科】计算机科学&#xff1b; 【检索情况】SCI在检&#xff1b; 【录用周期】3-5个月左右录用&#xff1b; 【截稿时间】12.31截稿&#xff1b; 【接收领域】区块链…

利用idea+ jclasslib插件查看和分析 Java 类文件的字节码

jclasslib介绍 jclasslib 插件是一个用于 IntelliJ IDEA 的工具&#xff0c;它允许开发者在集成开发环境&#xff08;IDE&#xff09;内直接查看和分析 Java 类文件的字节码。这个插件尤其对于想要深入了解 Java 字节码、类加载机制、以及 Java 虚拟机&#xff08;JVM&#xf…

MongoDB聚合:$replaceRoot

定义 $replaceRoot使用指定的文档替换输入文档。该操作可替换输入文档的所有字段&#xff0c;包括_id字段。可以将内嵌文档提升到顶层&#xff0c;可以为提升文档创建新文档。 注意&#xff1a; 从MongoDB4.2开始增加了$replaceWith&#xff0c;执行与$replaceRoot类似的动作…

网络基础操作练习

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 手把手教你操作华为设备&#xff0c;新手必看。 实验拓扑图 关于命令行视图 1&#xff09;用户视图 <Huawei> 2&#xff09;系统视图 [Hu…

C++初阶(类中的默认成员函数)

呀哈喽&#xff0c;我是结衣 今天给大家带来的是类里面的默认成员函数&#xff0c;一共有六个默认的成员函数哦&#xff0c;包括构造函数&#xff0c;析构函数&#xff0c;拷贝构造函数&#xff0c;运算符重载函数&#xff0c;const成员函数&#xff0c;那么正篇开始。 文章目…

java常见面试题:请解释一下Java中的常用网络协议,如HTTP、TCP/IP等。

Java是一种广泛使用的编程语言&#xff0c;它提供了丰富的库来支持各种网络协议&#xff0c;如HTTP、TCP/IP等。以下是这些协议的详细解释&#xff1a; HTTP (Hypertext Transfer Protocol)&#xff1a; 用途&#xff1a;HTTP是用于从服务器请求和发送网页的协议。当我们浏览网…

Go语言中的性能考虑和优化

优化您的Go代码以达到最佳性能 性能优化是软件开发的关键方面&#xff0c;无论您使用哪种编程语言。在这篇文章中&#xff0c;我们将探讨Go语言中的性能考虑和优化&#xff0c;Go是一种以其效率而著称的静态类型和编译语言。我们将深入探讨三个关键领域&#xff1a;分析并发代…

pytorch01:概念、张量操作、线性回归与逻辑回归

目录 一、pytorch介绍1.1pytorch简介1.2发展历史1.3pytorch优点 二、张量简介与创建2.1什么是张量&#xff1f;2.2Tensor与Variable2.3张量的创建2.3.1 直接创建torch.tensor()2.3.2 从numpy创建tensor 2.4根据数值创建2.4.1 torch.zeros()2.4.2 torch.zeros_like()2.4.3 torch…

AutoSAR(基础入门篇)4.6-Autosar_BSW的Watchdog功能

Autosar_Watchdog功能 一、Autosar_BSW的Watchdog功能 1、Watchdog组件图 2、架构与术语解释 二、看门狗规范