正則表達式&&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程序