Java8-lambda
lambda
學習記錄lambda,java 8 引入lambda將是對使用集合的一次重大改變,雖然看著很難懂,但是用著用著就好了,本文將用幾個例子舉例,本文參考的網上的一些例子。違刪。新手挑戰區。
lambda主要的表示形式
(params) -> expression
(params) -> statement
(params) -> { statements }Example
() – > System.out.println(” Lambda Expressions”);
(int i, int j) -> System.out.println(i+j);
Example No.1
遍歷陣列等
List features = Arrays.asList("Lambdas", "Method", "Java", "Hello");
features.forEach(n -> System.out.println(n));
// 使用Java 8的方法引用更方便,方法引用由::雙冒號操作符標示,
features.forEach(System.out::println);
Example No.2
獲取數字的個數、最小值、最大值、總和以及平均值
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());
結果:
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
Example No.3
map – reduce 例子
List<Integer> costBeforeTax = Arrays.asList(100, 200, 300, 400, 500);
//這個是將每個數都變成浮點數 * 12
costBeforeTax.stream().map((cost) -> cost + .12 * cost ).forEach(System.out::println);
//這個是將每個數都變成浮點數 * 12 然後再算和
double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost).reduce((sum, cost) -> sum + cost).get();
System.out.println("Total : " + bill);
結果:
112.0
224.0
336.0
448.0
560.0
Total : 1680.0
map---對列表的每個元素應用函式使用
// 將字串換成大寫並用逗號連結起來
List<String> G7 = Arrays.asList("USA", "Japan", "France", "Germany", "Italy", "U.K.","Canada");
String G7Countries = G7.stream().map(x -> x.toUpperCase()).collect(Collectors.joining(", "));
System.out.println(G7Countries);
Example No.4
匿名類
// Java 8之前:
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Rock it!");
System.out.println("Hello world");
}
}).start();
//java8 支援
new Thread (() -> {
System.out.println("Rock it!");
System.out.println("hello world!");
}).start();
結果:
Rock it!
Hello world!
Example No.5
函式式介面Predicate
Java 8也新增了一個包,叫做 java.util.function。它包含了很多類,用來支援Java的函數語言程式設計。其中一個便是Predicate,使用 java.util.function.Predicate 函式式介面以及lambda表示式,可以向API方法新增邏輯,用更少的程式碼支援更多的動態行為。下面是Java 8 Predicate 的例子,展示了過濾集合資料的多種常用方法。Predicate介面非常適用於做過濾。
// 甚至可以用and()、or()和xor()邏輯函式來合併Predicate,
// 例如要找到所有以J開始,長度為四個字母的名字,你可以合併兩個Predicate並傳入
List<String> languages = Arrays.asList("Java", "Scala", "C++", "Haskell", "Lisp","h","d","map","r");
Predicate<String> startsWithJ = (n) -> n.startsWith("J");
Predicate<String> fourLetterLong = (n) -> n.length() == 4;
languages.stream()
.filter(startsWithJ.and(fourLetterLong))
.forEach((n) -> System.out.print("nName, which starts with `J` and four letter long is : " + n));
執行結果
Original List : [Java, Scala, C++, Haskell, Lisp, h, d, map, r], filtered list : [Java, Scala, C++, Haskell, Lisp, map]