正则表达式&&Lambda表达式
正则表达式和Lambda表达式是Java编程中两个非常实用的特性。正则表达式用于字符串匹配与处理,而Lambda表达式则让函数式编程在Java中变得更加简洁。本文将介绍它们的基本用法,并结合示例代码帮助理解。同时要注意,正则表达式和Lambda并非是Java特有,很多语言都支持二者的使用
1. 正则表达式(Regular Expressions)
正则表达式(Regex)是一种强大的字符串匹配和处理工具,常用于:
- 验证输入格式(如邮箱、电话号码)
- 查找/替换文本
- 字符串分割
1.1 基本语法
符号 | 说明 |
---|---|
\d | 匹配数字 [0-9] |
\w | 匹配单词字符 [a-zA-Z0-9_] |
\s | 匹配空白字符(空格、制表符等) |
. | 匹配任意字符(除换行符) |
* | 匹配前一个字符 0次或多次 |
+ | 匹配前一个字符 1次或多次 |
? | 匹配前一个字符 0次或1次 |
{n} | 匹配前一个字符 恰好n次 |
^ | 匹配字符串开头 |
$ | 匹配字符串结尾 |
对于诸如\s
,\w
类的字符类正则表达式,在敲程序时需要敲\\s \\w
,这是因为,单个的\
表示为一个转义字符,如\n \t
等。因此需要\\
来表示一个普通的\
1.2 Java中的正则表达式
Java通过 java.util.regex
包提供支持
在匹配正则表达式时,[]用于字符类,比如[abc]
用来检测字符串对应位置特定字符串是否为a或b或c中的任一字符。没有方括号,只有"abc"
则分别检测第一个字符是否为a
第二个字符是否为b
第三个字符是否为c
,当然,[a]
用来匹配单个字符也没有问题,只是有些冗余
示例1:匹配手机号
public class RegaxTest {public static void main(String[] args) {Scanner sc = new Scanner(System.in);String s = sc.nextLine();if(s.matches("1\\d{10}")){System.out.println("YES");}else{System.out.println("NO");}}
}
示例2:字符串分割
split
是String
类中的方法,主要用来拆分字符串
//按照给定的正则表达式拆分字符串
public String[] split(String regex)
// 按照给定的正则表达式拆分字符串,最多拆分出 limit 个元素
public String[] split(String s, int limit)//第一个参数s也可以是特殊字符如“,”, “.”
- 示例
String text = "Java,Python,C++,JavaScript";
String[] languages = text.split(","); // 按逗号分割
System.out.println(Arrays.toString(languages));
- 输出
[Java, Python, C++, JavaScript]
2. Lambda表达式(Java 8+)
Lambda表达式是Java 8引入的函数式编程特性,用于简化匿名内部类的写法。本质上,Lambda表达式是对函数式接口(只有一个抽象方法的接口)的一种实现,下面的Comparator
接口和Runnable
接口都是函数式接口
2.1 Lambda基本语法
(参数) -> { 代码块 }
-
如果只有一行代码,可以省略
{}
和return
:(a, b) -> a + b
-
如果没有参数,用
()
:() -> System.out.println("Hello")
-
如果只有一个参数,可以省略
()
element -> System.out.ptintln("这个元素是" + element)
需要注意的是,Lambda
表达式是一种匿名函数,它没有自己独立的类型,必须依赖于一个函数式接口来确定其类型和行为
2.2 Lambda常见用法
示例1:替代匿名内部类(Runnable)
//匿名内部类
new Thread(new Runnable() {@Overridepublic void run() {System.out.println("线程运行");}
}).start();// Lambda写法
new Thread(() -> System.out.println("线程运行")).start();
示例2:集合遍历(forEach)
List<String> list = Arrays.asList("Java", "Python", "C++");// 传统写法
for (String s : list) {System.out.println(s);
}// Lambda写法
list.forEach(s -> System.out.println(s));
示例3:排序(Comparator)
List<Integer> numbers = Arrays.asList(5, 3, 8, 1);// 匿名Comparator
numbers.sort(new Comparator<Integer>() {@Overridepublic int compare(Integer a, Integer b) {return a - b;}
});// Lambda写法
numbers.sort((a, b) -> a - b);System.out.println(numbers); // [1, 3, 5, 8]
3. 结合正则表达式和Lambda
我们可以用Lambda表达式优化正则匹配操作,例如过滤符合规则的字符串:
List<String> emails = Arrays.asList("test@example.com","invalid-email","user@domain.com"
);
// 使用Lambda过滤有效邮箱
List<String> validEmails = emails.stream().filter(email -> email.matches("^[\\w.-]+@[\\w.-]+\\.[a-z]{2,6}$")).collect(Collectors.toList());System.out.println(validEmails);
输出:
[test@example.com, user@domain.com]
总结
特性 | 用途 | 示例 |
---|---|---|
正则表达式 | 字符串匹配、验证、分割 | "\\d+".matches("123") |
Lambda表达式 | 简化匿名类、函数式编程 | (a, b) -> a + b |
正则表达式适合字符串处理,而Lambda让代码更简洁,两者结合可以写出更高效的Java程序