屌絲就愛嘗鮮頭——java8再判斷


  這節,我們來通過具體的實例來看看Java8的具體用法。

  首當其沖,就是lambda用法。

  這里的案例,就是用lambda來實現runnable接口,我們知道以前用匿名內部類的方式來實現runnable接口,這種方法晦澀難懂,用lambda表達式實現以后,這樣的代碼清爽了不少。上兩種對比的代碼:

  

    public static void main(String[] args) {

        new Runnable() {
            public void run() {
               System.out.println("這是匿名內部類實現的runnable接口");        
            }
        }.run();    
        int i=0;
        Runnable runnable=()->{
            System.out.println("i="+i);
            System.out.println("aaaaaaaaaaaaaa");
        };
        runnable.run();
    }

  通過上述代碼了,我們可以明明白白的看到這回事,lambda表達式中能夠訪問非靜態的局部變量,這樣,我們程序員們的代碼是不是少寫了很多,層次結構明了了很多。

   案例二,我們分別用匿名內部類和lambda表達式來實現接口中帶參的方法,比較孰優孰劣。

  我們這里做一個接口叫IAction,分別讓其實現,上代碼:

package test;

public class TestInterface {

    public static void main(String[] args) {
        IAction iAction=new IAction() {
            
            @Override
            public void excute(String content) {
                // TODO Auto-generated method stub
                  System.out.println(content);        
            }
        };
        iAction.excute("aaaa");
        IAction iAction2=(String content)->{
            System.out.println(content);
        };
        iAction2.excute("bbbb");
    }
   static interface IAction{
       void excute(String content);
   }

}

  根據上面的代碼,我們得出來這樣的總結:

  ①利用lambda表達式以后,代碼編寫的篇幅大量的減少。

  ②利用lambda表達式以后,不用顯式進行方法名稱的調用。

  ③利用lambda表達式以后,代碼的層次感更加強烈明了。

  而Stream接口類似於一個什么了,一個泛型接口,使用戶聯合lambda表達式使其對數據集的操作更加的方便。下面,我通過一個對list操作的例子,老看看stream接口確實是為為集合操作帶來了不少的好處。首先來一個people的實體類:

  

static class People{
        String name;
        int age;
        double height;
        public People(String name, int age, double height) {
            super();
            this.name = name;
            this.age = age;
            this.height = height;
        }
        @Override
        public String toString() {
            // TODO Auto-generated method stub
            return "People[ name="+name+",age="+age+",height="+height+"].";
        }
        
    }

  然后來一個創建list集合的方法,源代碼如下:

  

static List<People> createPeople()
    {
        List<People> peoples=new ArrayList<People>();
        People people=new People("鄭飛", 34, 1.99);
        peoples.add(people);
        people=new People("劉飛", 29, 1.89);
        peoples.add(people);
        people=new People("馬飛", 24, 1.79);
        peoples.add(people);
        people=new People("王菲", 19, 1.69);
        peoples.add(people);
        return peoples;
    }

 

  接着,來一個Stream接口,將其利用Foreach循環將其輸出,源代碼如下:

    public static void main(String[] args) {
         List<People> peoples=   createPeople();
         Stream<People> stream= peoples.stream();
         stream.forEach((e)->{System.out.println(e.toString());});
    }

  運行結果如下:

  

  可見,Stream接口作用有如下:

 

  流可以是無限的、有狀態的,可以是順序的,也可以是並行的。在使用流的時候,你首先需要從一些來源中獲取一個流,執行一個或者多個中間操作,然后執行一個最終操作。中間操作包括filter、map、flatMap、peel、distinct、sorted、limit和substream。終止操作包括forEach、toArray、reduce、collect、min、max、count、anyMatch、allMatch、noneMatch、findFirst和findAny。 java.util.stream.Collectors是一個非常有用的實用類。該類實現了很多歸約操作,例如將流轉換成集合和聚合元素。 使其對集合操作更加靈活。

  說了這么多謂詞操作,我這里用filter實例作為講解。

  再上述的代碼中,加上短短的一句代碼,就ko了。

         stream=stream.filter(e->e.getAge()>20);

  可見了,有了這些操作的方法以后,操作集合也不需要你寫過多的代碼,就像sql一樣,利用命令式語言來處理集合操作了。

   通過了,這些Java8的小案例,我們明白了,lambda表達式和Stream雖然是采用c2c(copy to C#)的方式,但是C#多年的經驗確實告訴我們了,確實很好用,一切語言都是為了我們,使我們少寫代碼,提高相應的工作效率而奮斗。

 

 

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM