lambda

  // Java 8以前:
new Thread( new Runnable() {
     @Override
     public void run() {
     System.out.println( "Before Java8, too much code for too little to do" );
     }
}).start();
//Java 8方式:
new Thread( () -> System.out.println( "In Java8, Lambda expression rocks !!" ) ).start();
使用()->代替Runnable匿名類
語法:
(params) -> expression
(params) -> statement
(params) -> { statements }
有參數時:
( int even, int odd) -> even + odd
2.事件監聽
// Java 8以前:
JButton show =  new JButton( "Show" );
show.addActionListener( new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
     System.out.println( "Event handling without lambda expression is boring" );
     }
});
// Java 8方式:
show.addActionListener((e) -> {
     System.out.println( "Light, Camera, Action !! Lambda expressions Rocks" );
});
3.集合遍歷
// Java 8以前:
List features = Arrays.asList( "Lambdas" , "Default Method" , "Stream API" , "Date and Time API" );
for (String feature : features) {
     System.out.println(feature);
}
// Java 8以後:
List features = Arrays.asList( "Lambdas" , "Default Method" , "Stream API" , "Date and Time API" );
features.forEach(n -> System.out.println(n));
-----------------------------------------------------------------------------------------------------
package com.demo; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; /** * @see 參考博客:http://blog.csdn.net/bitcarmanlee/article/details/70195403 * */ public class LambdaTest01 { /** * Stream和集合的區別: 1.Stream不會本身存儲元素。元素儲存在底層集合或者根據須要產生。 2.Stream操做符不會改變源對象。相反,它會返回一個持有結果的新的Stream。 3.Stream操做多是延遲執行的,這意味着它們會等到須要結果的時候才執行 * * */ public static void main(String[] args) { LambdaTest01 lam01=new LambdaTest01(); //lambda方法測試匿名函數 //lam01.testLamRun(); //測試list集合 //lam01.testList(); //String[] arr=new String[]{"1","2","3","4"}; //lam01.testPrime(arr); lam01.testMap(); //lam01.testReduce(); //lam01.testFilter(); //lam01.callPredicate(); } /*** * 使用流來完成素數去重 * */ public void testPrime(String...str) { List<String> list=Arrays.asList(str); List<Integer> in=list.stream() .map(tmp->new Integer(tmp)) .filter(tmp->isPrime(tmp)) .distinct() .collect(Collectors.toList()); System.out.println("distinctPrimary result is: " + in); } public boolean isPrime(int n) { if(n < 2) return false; if(n == 2) return true; if(n%2==0) return false; for(int i = 3; i*i <= n; i += 2) if(n%i == 0) return false; return true; } /** * 處理匿名函數 * */ public void testLamRun() { //1.8之前方式 new Thread(new Runnable() { @Override public void run() { System.out.println("--1.8之前方式--"); } }).start(); //lambda使用()->代替匿名函數的實現 new Thread(()->System.out.println("--lambda表達式測試--")).start(); } /** * 處理list集合 * */ public void testList() { List<String> list=new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); //jdk1.8之前方式 for(String tmp:list) { System.out.println("--集合元素--:"+tmp); } //lambda方式 list.forEach(tmp->{System.out.println("--lamdba-"+tmp);}); //另外一種迭代,相似scala list.forEach(System.out::println); } /** * map測試 * map將一個對象轉換成另一個對象 * */ public void testMap() { List<Double> list=Arrays.asList(10.0,20.0,30.0); list.stream().map(x->x+x*0.5).forEach(System.out::println); //使用Person對象進行map測試 Person person=new Person("aa",11); //HashMap::new 新建一個HashMap對象 Map result=Stream.of(person).collect(HashMap::new,(map,p)->map.put(p.name,p.age),Map::putAll); //Collectors.toMap方法的第三個參數爲鍵值重複處理策略,若是不傳入第三個參數,當有相同的鍵時,會拋出一個IlleageStateException Map collecResult=Stream.of(person).collect(Collectors.toMap(p->p.name,p->p.age,(exsit,newv)->newv)); List<Map.Entry<String, Integer>> mapToList=new ArrayList<>(); mapToList.addAll(collecResult.entrySet()); mapToList.forEach(m->System.out.println(m.getKey()+"---"+m.getValue())); } /** * reduce()方法的處理方式通常是返回單個的結果值,每次都產生新的數據集 * collect()方法是在原數據集的基礎上進行更新,過程當中不產生新的數據集。 * 將多個對象合併成一個對象 * */ public void testReduce() { List<Double> list=Arrays.asList(10.0,20.0,30.0); double data=list.stream().map(x->x+x*0.05).reduce((sum,x)->sum+x).get(); System.out.println("--reduce-result-"+data); //以100爲起始數,進行累加計算 int result=Stream.of(1, 2, 3, 4).reduce(100, (sum, item) -> sum + item); System.out.println("--result--"+result); result=Stream.of(1, 2, 3, 4).reduce(100, Integer::sum); System.out.println("--result-sum-"+result); } /** * filter * 過濾掉一部分數據 * */ public void testFilter() { List<Double> list=Arrays.asList(10.0,20.0,30.0,40.0); List<Double> resultList=list.stream().filter(x->x>20.0).collect(Collectors.toList()); //resultList.forEach(System.out::println); resultList.forEach(x->System.out.println(x)); } public void callPredicate() { List<String> list=Arrays.asList("Java","scala","phython","Shell","R"); System.out.println("---startWith---"); testPredicate(list, x->x.startsWith("J")); System.out.println("--endWith--"); testPredicate(list, x->x.endsWith("a")); System.out.println("---all-print-"); testPredicate(list, x->true); System.out.println("--none-ptint-"); testPredicate(list, x->false); System.out.println("--word more than 3--"); testPredicate(list, x->x.length()>4); } /** * Predicate 源自jdk8的java.util.function * 適用於過濾數據 * */ public void testPredicate(List<String> list,Predicate<String> condition) { //x->condition.test(x) 取出變量x而後根據condition進行比較 list.stream().filter(x->condition.test(x)).forEach(System.out::println); } } class Person { public String name; public int age; Person(String name,int age) { this.name=name; this.age=age; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + "]"; } }









相關文章
相關標籤/搜索