JDK1.8中Lambda表示式的應用
JDK1.8中Lambda表示式的應用
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
相關文章
- Java中Lambda表示式的應用Java
- Lambda 表示式的應用
- JDK1.8之lambda表示式JDK
- JDK1.8 之Lambda表示式JDK
- JDK1.8及以上的Lambda表示式JDK
- JDK1.8 Lambda 表示式的學習JDK
- JDK1.8新特性--Lambda表示式JDK
- jdk1.8新特性:Lambda表示式JDK
- jdk1.8 lambda表示式入門JDK
- JDK1.8的新特性之Lambda表示式JDK
- JDK1.8新特性之Lambda表示式JDK
- JDK1.8新特性之Lambda表示式()->JDK
- jdk1.8 新特性之 lambda表示式JDK
- JDK1.8之Lambda解析與表示式的使用JDK
- Python中lambda表示式的語法與應用Python
- JDK1.8最新特性--Lambda表示式(重點)JDK
- jdk1.8 新特性之 如何寫lambda表示式JDK
- Java 中的 Lambda 表示式Java
- Lambda表示式基本語法與應用
- C#中的Lambda表示式和表示式樹C#
- Java中Lambda表示式的使用Java
- Java 8 中的 lambda 表示式Java
- Java Lambda表示式應用介紹,幫助大家快速掌握LambdaJava
- Java8中的Lambda表示式Java
- Python中lambda表示式的用法Python
- [轉]Java 8 的 lambda 表示式 Java 8 的 lambda 表示式Java
- JDK1.8新特性:Lambda表示式語法和內建函式式介面JDK函式
- lambda 表示式
- lambda表示式
- Java中lambda表示式詳解Java
- Java的Lambda表示式Java
- cpp的lambda表示式
- Java中Lambda表示式的進化之路Java
- C# Lambda表示式詳解,及Lambda表示式樹的建立C#
- 用 Lambda表示式傳遞委託
- Java | Lambda表示式Java
- Lambda表示式(Java)Java
- java lambda 表示式Java