作用:简化集合和数组操作的API
//过滤数组中第一个字母为张并且字母长度为3的名字
names.stream().filter(s->s.startsWith("张")).filter(s->s.length()==3);
核心思想:
(1)先得到集合或者数组的Stream流(就是一根传送带)
(2)把元素放上去
(3)然后就用这个Stream流简化的API来方便的操作元素
操作规范:
(1) 获取stream流:创建一条流水线,并把数据放到流水线上进行操作。
List<String> l=new Arraylist<>();
Stream<String> s=l.stream();
Map<String,Integer> maps=new Hashmap<>();
Stream<String> keystream=maps.keySet.stream();
Stream<Integer> value=maps.values.stream();
Stream<<Map,Entry<String,Integer>> keyvalue=maps.entrySet().stream();
//数组拿stream流
Stream<String> nameStream=Array.stream(names);
Stream<String> nameStream=Stream.of(names);
(2)中间方法:流水线上的操作,一次操作完成之后,还可以进行另外的操作。
代码 | 属性 |
---|---|
filter | 对流中元素进行过滤 |
limit | 获取前几个元素 |
skip() | 跳过前几个元素 |
distinct() | 去除流中重复的元素 |
concat(Stream a,Stream b) | 合并流a和流b |
list.stream().filter(s->s.startwith("张")).foreach(s->System.out.println(s));
long size=list.stream().filter(s->s.size==3).count();
list.stream().filter(s->s.startWith("张")).limit(2).forEach(System.out::println);
//当方法中s->System.out.println(s)参数相同可以使用方法引用.
//map加工方法:第一个参数是原材料,第二个参数是加工后的材料
list.stream().map(s->"黑马的"+s).forEach(System.out::println);
//把原来的名称加工成对象
list.stream().map(s ->new student(s)).forEach(System.out::println);
中间方法也称为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程。在Stream流中无法直接修改集合、数组中的数据。
(3)终结方法:一个stream流只能有一个终结方法,是流水线上最后一个操作。
代码 | 属性 |
---|---|
void forEach() | 对流中的每个元素遍历 |
int count() | 返回流中的元素数 |
终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。
代码 | 属性 |
---|---|
toList() | 把元素收集到list集合 |
toSet() | 把元素收集到set集合 |
toMap() | 把元素收集到Map集合中 |
基本含义:异常是程序在“编译”或者“执行”的过程中可能出现的问题,语法错误不算在异常体系中。 比如:数组索引越界、空指针异常、 日期格式化异常。
(1)默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
(2)异常会从方法中出现的点这里抛出给调用者,调用者最终抛出给JVM虚拟机。
(3)虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
(4)直接从当前执行的异常点干掉当前程序。
(5)后续代码没有机会执行了,因为程序已经死亡。
方法 throws 异常1 ,异常2 ,异常3 ..{}
//用在方法上,可以把方法内部出现的异常抛出给本方法的调用者
方法 throws Exception{}
缺点:这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
try{
// 监视可能出现异常的代码!
}catch(异常类型1 变量){
// 处理异常 }
catch(异常类型2 变量){
// 处理异常 }
标准写法:
try{ // 可能出现异常的代码!}
catch (Exception e){
e.printStackTrace(); // 直接打印异常栈信息
}
Exception可以捕获处理一切异常类型
建议在最外层调用处集中捕获处理即可。
自定义编译时异常
(1)定义一个异常类继承Exception.
(2) 重写构造器。
(3)在出现异常的地方用throw new 自定义对象抛出,
作用:编译时异常是编译阶段就报错,提醒更加强烈.!
自定义运行时异常
(1)定义一个异常类继承RuntimeException.
(2)重写构造器。
(3)在出现异常的地方用throw new 自定义对象抛出!
作用:可变参数用在形参中可以接收多个数据。
格式:数据类型...参数名称
好处:传输参数非常灵活,方便。可以不传输参数,可以传输1个或者多个,也可以传输一个数组
本质:数组
注意:
1.一个形参列表中可变参数只能有一个
2.可变参数必须放在形参列表的最后面
工具类:里面是一些静态方法,每个方法都是为完成一个公用的功能。
工具类不需要创建对象,直接调用类名访问即可,我们可以把工具类中的构造器私有化。
public class staticWay {
private staticWay(){
}
public static String createCode(int n)
{
String code="";
String data="abcdefghigklmnopqrstuvwxyz";
Random r=new Random();
for(int i=0;i<n;i++)
{
//获取随机索引对应的字符,连接给code
int index=r.nextInt(data.length());
code+=data.charAt(index);
}
return code;
}
}
代码块:类的五大组成之一(成员变量+构造器+方法+代码块+内部类)定义在类中方法外。在Java类下,用{}括起来的代码。
1.静态代码块:static{}
随着类的加载而加载并且自动触发执行,只执行一次。
初始化类内的静态资源。
2.构造代码块:{}(不多用)
每次创建对象的时候,调用构造器的执行前,就会先执行该代码块中的代码,用于初始化实例变量。
单例模式:
(1)开发中遇到的问题可能有n种解法,其中最优的解法被称为设计模式。
(2)单例模式:保证系统应用该模式的这个类永远只有一个实例,一个类创建一个对象,可以节省空间。
(3)饿汉单例设计模式:用类获取对象的时候,对象已经创建好了
public class SingleMan {
public static SingleMan instance=new SingleMan();
private SingleMan(){
}
}
//主函数中:
SingleMan s=SingleMan.instance;
(4)懒汉单例设计模式:真正需要该对象的时候才去创建对象(延迟加载对象)
public class SingleMan {
//定义一个静态成员变量存储一个对象只加载一次
public static SingleMan instance;
private SingleMan (){
}
//定义一个方法,对外返回单例对象
public static SingleMan getInstance(){
if(instance==null){
//第一次来拿对象需要创建
instance=new SingleMan ();
}
return instacnce;
}
}
//主函数中:
SingleMan s=SingleMan.getInstance();
如何在丰富接口功能的同时又不对子类代码进行更改:允许接口中定义带有方法体的方法。
//默认方法:必须用default修饰,默认是public修饰(实例方法)
//过继给实现类,让实现类对象调用
default void run(){
}
//静态方法:接口的静态方法,必须用接口来调用
static void run(){
}
//私有方法:必须在接口的内部才能访问
private void run(){
}
1.正则表达式可以用一些规定的字符来指定规则,用来校验数据格式的合法性。
2.匹配规则:
3.在方法中的应用:
String replaceAll(String regex,String newStr) | 按照正则表达式匹配的内容进行替换 |
---|---|
String[] spilt(String regex) | 按照正则表达式匹配的内容分割字符串,返回一个字符串数组 |
static list of(element) | 创建一个指定元素的list集合对象 |
---|---|
static set of(element) | 创建一个具有指定元素的set集合对象 |
static map of(element) | 创建一个具有指定元素的map集合对象 |