目录
1.正则表达式
2.爬虫
3.时间
4.包装类
5.工具类之Arrays
6.Lambda
1.正则表达式
用于验证字符串是否满足自己所需要的规则。方法:matches
注意:\在Java中有特殊涵义,是将其它的意思本来化,假设"是用来引用字符串的,但是你如果想要输出它,那是不是就变成了System.out.println(""");那很明显会报错,这需要加上\就行了,将"的意思本来化,就变成了普普通通的"了。正确形式System.out.println("\"");所有在使用上面的\d,\D,\s等等的时候就需要在它前面加上\。
public class aaa2 {public static void main(String[] args) {String r="2161672768";//qq号是9位到10位的,第一个不为0System.out.println(r.matches("[0-9]\\d{8,9}"));}
}
这里的{8,9}表示字符串的后面8个或者9个,也指前面的//d只能出现8次或者9次,因为前面的判断第一个是不是0,用掉了一个字符(【0-9】);
注意:matches(),括号里面的字符串,当然也可以这样。
public class aaa2 {public static void main(String[] args) {String r="2161672768";//qq号是9位到10位的,第一个不为0
// System.out.println(r.matches("[0-9]\\d{8,9}"));String e="[0-9]\\d{8,9}";System.out.println(r.matches(e));}
}
2.爬虫
搜索关键词或者关键句。
import java.util.regex.Matcher;
import java.util.regex.Pattern;public class aaa2 {public static void main(String[] args) {//有如下文本,请按照要求爬取数据。String str = "Java自从95年问世以来,经历了很多版本,目前企业中用的最多的是Java8和Java11,"+ "因为这两个是长期支持版本,下一个长期支持版本是Java17,相信在未来不久Java17也会逐渐登上历史舞台";//1.获取正则表达式的对象Pattern p = Pattern.compile("Java\\d{0,2}");//找java,java后面可以有0到2个数字//2.获取文本匹配器的对象,m:文本匹配器的对象,str:大串,p:规则,m要在str中找符合p规则的小串// 拿着m去读取str,找符合p规则的子串Matcher m = p.matcher(str);//3.利用循环获取while (m.find()) {String s = m.group();System.out.println(s);}}
}
结果如下:
拓展1:我们爬虫要爬的数据一般不止一个,matches有很好的解决方法。假设我们要爬虫java\\d{0,2}和c++\\d{0,2}怎么办呢
可以将String r="(java\\d{0,2})|(c++\\d{0,2})",没错中间的|就是你想的那样,类似c的||(或者)功能,在该方法中同样试用。(只有一条|)
拓展2(需求1):String r="java(?=8|11|17)"
?表示java,=表示java后面是否有8或者11或者17,有就爬取,但是这里打印的时候不会将后面的数字打印出来,只会打印java,方式跟之前的一样,只不过规则的字符串变了。
还有将r="((?i)java)(?=8|11|17)"表示忽略java的大小写进行爬取。
拓展3(需求2):String r="((?i)java)(8|11|17)"或者String r="((?i)java)(?:8|11|17)"
拓展4(需求3)String r="((?i)java)(?!8|11|17)
拓展5:贪婪和非贪婪爬取
拓展6:捕获分组和非捕获分组
3.时间
获取当前时间:Date r=new Date(); long time =r.getTime(); 计算现在距离起始时间过了多少毫秒
修改距离起始时间的毫秒值 r.setTime(毫秒值);
long的通常要加上大写或者小写的l,L更加显眼。
该方法打印结果如下:
修改后可运用到项目的如下;(默认)
日期的相关标识符:
自定义时间格式如下:
字符串设置时间格式:(方法中的格式要更字符串一样否则会报错)
4.包装类
包装类(Wrapper Class)在Java中是一种特殊的类,它们用来将基本数据类型包装成对象。主要的包装类有 Integer
、Long
、Float
、Double
、Boolean
、Character
、Byte
和 Short,分别对应基本数据类型int,long,float,double,boolean,char,byte,short。在后序的集合和Map中有相关例子。
作用:
1.将基本数据类型转换为对象
2.提供了方法来操作基本数据类型
3.支持泛型编程
4.提供了常量和静态方法
5.实现了一些接口
6.自动装箱和拆箱
装箱指将基本数据类型转换成包装对象,拆箱指将包装对象转换成基本数据练习。自动指他们创建出来后,在使用时,底层逻辑会自动转化,不需要自己手动转化。
5.工具类之Arrays
6.Lambda
Lambda 表达式使得 Java 语言在编程风格上更加现代化和函数式,提升了代码的简洁性、可读性和并行处理的能力,是 Java 8 版本中一个重要的语言特性。
注意:
1.Lambda表达式可以用来简化匿名内部类的书写
2.Lambda表达式只能简化函数式接口的匿名内部类的写法
3.函数式接口:有且仅有有一个抽象方法的接口叫做函数式接口,接口上方可以加@FunctionalInterface注解
Lambda的简写例子如下:
import java.util.Arrays;
import java.util.Comparator;public class test {public static void main(String[] args) {//初识lambda表达式Integer[] arr1 = {3, 8, 5, 7, 9, 1, 4, 2};Integer[] arr2 = {3, 8, 5, 7, 9, 1, 4, 2};Arrays.sort(arr1,new Comparator<Integer>() {public int compare(Integer o1, Integer o2) {return o2-o1;}});System.out.println(Arrays.toString(arr1));Arrays.sort(arr1, (Integer o1, Integer o2) -> {return o1 - o2;});System.out.println(Arrays.toString(arr1));Arrays.sort(arr2, (o1, o2) -> o1 - o2);System.out.println(Arrays.toString(arr2));}
}
结果如下:
为了保证Lambda表达式的目标类型是一个明确的函数式接口,有如下三种常用方式;
1.将Lambda表达式赋值给函数式接口类型的变量。
2.将Lambda表达式作为函数式接口类型的参数传给某个方法。
3.使用函数式接口等Lambda表达式进行强制转换。
可以运行:
//Ring接口中只包含一个无参数的方法
//Lambda表达式代表的匿名方法实现了Ring接口唯一的,无参数的方法
//因此下面的Lambda表达式创建了一个Ring的对象
Ring r=()->{
for(int i=0;i<=100;i++)
System.out.println();
}
无法运行:
Objext r=()->{
for(int i=0;i<=100;i++)
System.out.println();
}
因为Object不是函数式接口,想要强制转换,前提是他们类型一直,如参数, 返回值
Object r=(Ring)()->{
for(int i=0;i<=100;i++)
System.out.println();
}