使用() -> {} 替代匿名類:java
//Before Java 8:new Thread(new Runnable() { @Override public void run() { System.out.println("Before Java8 "); } }).start();//Java 8 way:new Thread( () -> System.out.println("In Java8!") ).start(); Output:too much code, for too little to doLambda expression rocks !!
你可使用 下面語法實現Lambda:express
(params) -> expression
(params) -> statement
(params) -> { statements }編程
若是你的方法並不改變任何方法參數,好比只是輸出,那麼能夠簡寫以下:swift
() -> System.out.println("Hello Lambda Expressions");ide
若是你的方法接受兩個方法參數,以下:函數
(int even, int odd) -> even + odd
測試
若是你曾經作過Swing 編程,你將永遠不會忘記編寫事件偵聽器代碼。使用lambda表達式以下所示寫出更好的事件偵聽器的代碼。google
// Before Java 8:JButton show = new JButton("Show"); show.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("without lambda expression is boring"); } });// Java 8 way:show.addActionListener((e) -> { System.out.println("Action !! Lambda expressions Rocks"); });
在java 8中你可使用Lambda表達式替代醜陋的匿名類。spa
features .asList(, , , ); ( feature ) { .out.println(feature); } features .asList(, , , ); features.forEach(n -> .out.println(n));features.forEach(.out::println); and
方法引用是使用兩個冒號::這個操做符號。線程
爲了支持函數編程,Java 8加入了一個新的包java.util.function,其中有一個接口java.util.function.Predicate是支持Lambda函數編程:
(args[]){ List languages = Arrays.(, , , , ); System..(); filter(languages, (str)->str.()); System..(); filter(languages, (str)->str.()); System..(); filter(languages, (str)->); System..(); filter(languages, (str)->); System..(); filter(languages, (str)->str.() > ); } (List names, Predicate condition) { (String names) { (condition.(name)) { System..(name + ); } } } }Languages which starts with J : Java Languages which ends with a Java Scala Print all languages : Java Scala C++ Haskell Lisp Print no language : Print language whose length greater than : Scala Haskell (List names, Predicate condition) { names.().((name) -> (condition.(name))) .((name) -> {System..(name + ); }); }
你能看到來自Stream API 的filter方法可以接受 Predicate參數, 可以容許測試多個條件。
java.util.function.Predicate提供and(), or() 和 xor()能夠進行邏輯操做,好比爲了獲得一串字符串中以"J"開頭的4個長度:
<> startsWithJ (n) -> n.startsWith(); <> fourLetterLong (n) -> n.length() == ; names.stream() .filter(startsWithJ.(fourLetterLong)) .forEach((n) -> .out.print( + n));
其中startsWithJ.and(fourLetterLong)是使用了AND邏輯操做。
最流行的函數編程概念是map,它容許你改變你的對象,在這個案例中,咱們將costBeforeTeax集合中每一個元素改變了增長必定的數值,咱們將Lambda表達式 x -> x*x傳送map()方法,這將應用到stream中全部元素。而後咱們使用 forEach() 打印出這個集合的元素.
costBeforeTax .asList(, , , , ); ( cost ) { double price cost + .*cost; .out.println(price); } costBeforeTax .asList(, , , , ); costBeforeTax.stream().map((cost) -> cost + .*cost) .forEach(.out::println);
reduce() 是將集合中全部值結合進一個,Reduce相似SQL語句中的sum(), avg() 或count(),
// Applying 12% VAT on each purchase// Old way:List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); double total = 0;for (Integer cost : costBeforeTax) { double price = cost + .12*cost; total = total + price; }System.out.println("Total : " + total);// New way:List costBeforeTax = Arrays.asList(100, 200, 300, 400, 500); double bill = costBeforeTax.stream().map((cost) -> cost + .12*cost)
.reduce((sum, cost) -> sum + cost)
.get();System.out.println("Total : " + bill);OutputTotal : 1680.0Total : 1680.0
Filtering是對大型Collection操做的一個通用操做,Stream提供filter()方法,接受一個Predicate對象,意味着你能傳送lambda表達式做爲一個過濾邏輯進入這個方法:
<> filtered strList.stream().filter(x -> x.length()> ) .collect(.toList());.out.printf(, strList, filtered); [, , , , , ], filtered list , bcd, defg
咱們常常須要對集合中元素運用必定的功能,如表中的每一個元素乘以或除以一個值等等.
<> G7 .asList(, , , , , ,); G7Countries G7.stream().map(x -> x.toUpperCase()) .collect(.joining());.out.println(G7Countries); , , , , , U.K.,
上面是將字符串轉換爲大寫,而後使用逗號串起來。
使用Stream的distinct()方法過濾集合中重複元素。
<> numbers .asList(, , , , , , );<> distinct numbers.stream().map( i -> i*i).distinct() .collect(.toList());.out.printf(, numbers, distinct); [, , , , , , ], duplicates , , , ,
<> primes .asList(, , , , , , , , , ); stats primes.stream().mapToInt((x) -> x) .summaryStatistics();.out.println( + stats.getMax());.out.println( + stats.getMin());.out.println( + stats.getSum());.out.println( + stats.getAverage());