JDK1.8中Lambda表示式的應用

餘盛朋發表於2019-06-15

Labda表示式的介紹

Java8最值得學習的特性就是Lambda表示式和Stream API,如果有python或者javascript的語言基礎,對理解Lambda表示式有很大幫助,因為Java正在將自己變的更高階,更人性化。我們甚至可以這麼說lambda表示式其實就是實現SAM介面的語法糖。我們都知道在js中有閉包的概念,並且很好用,在java中有了Lambda表示式,我們也可以實現閉包的功能,將一個函式表示式作為函式引數使用。lambda寫的好可以極大的減少程式碼冗餘,同時可讀性也好過冗長的內部類,匿名類。

Lambda表示式的基本語法是:
(Type1 param1, Type2 param2, …, TypeN paramN) -> {
statment1;
statment2;
//…
return statmentM;
}

Lambda表示式的使用條件是:
1).使用lambda表示式的型別必須是一個只含有一個抽象方法的藉口
2).lambda只能使用final修飾的變數

之前我們想要將行為傳入函式,僅有的選擇就是匿名內部類。Java8釋出以後,lambda表示式將大量替代匿名內部類的使用,簡化程式碼的同時,更突出了原來匿名內部類中最重要的那部分包含真正邏輯的程式碼。尤其是對於做資料的同學來說,當習慣使用類似scala之類的函數語言程式設計語言以後,體會將更加深刻。現在我們就來看看Java8中lambda表示式的一些常見寫法。

1.forEach遍歷Map

//1.forEach遍歷Map
System.out.println("\n1.forEach遍歷Map");
Map<String, Object> map = new HashMap<>();
map.put("key1", 11);
map.put("key2", 12);
map.put("key3", 13);
map.put("key4", 14);
map.forEach((key,value)->{
	System.out.println("key:"+key+",value:"+value);
});

輸出:
1.forEach遍歷Map
key:key1,value:11
key:key2,value:12
key:key3,value:13
key:key4,value:14

2.forEach遍歷List

//2.forEach遍歷List
System.out.println("\n2.forEach遍歷List");
List<Integer> list =  new ArrayList<Integer>() ;
list.add(1);
list.add(2);
list.add(3);
list.forEach(value->System.out.println(value));

輸出:
2.forEach遍歷List
1
2
3

3.在多執行緒中使用Lambda表示式

//3.在多執行緒中使用Lambda表示式
System.out.println("\n3.在多執行緒中使用Lambda表示式");
new Thread(()->System.out.println("new Thread start")).start(); 

輸出:
3.在多執行緒中使用Lambda表示式
new Thread start

4.自定義Lambda表示式功能

//4.自定義Lambda表示式功能
interface MathOperator{
	int operator(int a, int b);
	
}
public static void calc(int a ,int b, MathOperator operator){
	System.out.println(operator.operator(a, b));
}

System.out.println("\n4.自定義Lambda表示式功能");
MathOperator add = (a,b)->a+b ;
MathOperator sub = (a,b)->a-b ;
MathOperator mul = (a,b)->a*b ;
MathOperator div = (a,b)->a/b ;

calc(3, 5, add);
calc(3, 5, sub);
calc(3, 5, mul);
calc(3, 5, div);

輸出:
4.自定義Lambda表示式功能
8
-2
15
0

5.Predicate介面實現資料過濾

System.out.println("\n5.Predicate介面實現資料過濾");
List<String> filterList = new LinkedList<>() ;
filterList.add("1");
filterList.add("abc");
filterList.add("java");
filterList.add("python2");
filterList.add("python3");
filterList.add("c++");
filture(filterList, str->str.startsWith("j")) ;
//單條件過濾
filterList.stream().filter(str->str.contains("++")).forEach(value->System.out.println(value)) ;
//多條件邏輯過濾
Predicate<String> startWith = str->str.startsWith("p") ;
filterList.stream().filter(startWith.and(str->str.contains("2"))).forEach(value-								  >System.out.println(value)) ;

輸出:
5.Predicate介面實現資料過濾
java
c++
python2

6.Lambda的map和reduce操作

//3.在多執行緒中使用Lambda表示式
System.out.println("\n6.Lambda的map和reduce操作");
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
//map操作讓每一個元素加上它之前的0.12倍
costBeforeTax.stream().map(cost -> cost+0.12*cost).forEach(System.out::println);
System.out.println(costBeforeTax.stream().reduce((sum,cost)->sum+cost).get()); //求和

輸出:
6.Lambda的map和reduce操作
112.0
224.0
336.0
448.0
560.0
1500

7.建立一個字串列表,每個字串長度大於2

System.out.println("\n7.建立一個字串列表,每個字串長度大於2");
List<String> strList = Arrays.asList(new String[]{"abc","de","abcde"});
List<String> filtered = strList.stream().filter(x -> x.length()> 2).collect(Collectors.toList());
System.out.printf("Original List : %s, filtered list : %s %n", strList, filtered);

輸出:
7.建立一個字串列表,每個字串長度大於2
Original List : [abc, de, abcde], filtered list : [abc, abcde]

8.獲取數字的個數、最小值、最大值、總和以及平均值

System.out.println("\n8.獲取數字的個數、最小值、最大值、總和以及平均值");
List<Integer> primes = Arrays.asList(2, 3, 5, 7, 11, 13, 17, 19, 23, 29);
IntSummaryStatistics stats = primes.stream().mapToInt((x) -> x).summaryStatistics();
System.out.println("Highest prime number in List : " + stats.getMax());
System.out.println("Lowest prime number in List : " + stats.getMin());
System.out.println("Sum of all prime numbers : " + stats.getSum());
System.out.println("Average of all prime numbers : " + stats.getAverage());

輸出:
8.獲取數字的個數、最小值、最大值、總和以及平均值
Highest prime number in List : 29
Lowest prime number in List : 2
Sum of all prime numbers : 129
Average of all prime numbers : 12.9

相關文章