JAVA 8 新特性 (值得學習)

來源:互聯網
上載者:User

標籤:java 8 新特性


JAVA 8 已經出現好長時間了,大的互連網公司很多都已經使用了,甚至很多知名互連網公司踩過很多坑,也有一些大牛分享出了他們的實戰經驗。去很多知名的互連網公司經常會被面試官問,你瞭解java 8嗎?你知道它的一些新特性嗎?好像似乎成了一面面試官必問的一道題目。這篇博文,只是簡答的介紹了一下新特性,同學們還得自己實際操作,深入瞭解,最好能實際應用到項目裡,如果你是項目組裡用的比較早,用的比較多的同學,還會被其他的同事注意到你,哈哈。


Lambda運算式和函數式介面

下面就是簡單的lambda表示的應用,代碼非常簡潔,直接item則是list集合裡的String,輸出就可以了

,item是編譯器自動推理得出是一個String類型的

List<String> list = Arrays.asList("sdc","zs","ls","ww");list.forEach(item -> {System.out.println(item);});Stream.of(12,21,13,31).filter( s -> {System.out.println("out:" +s); return true;}).forEach(System.out::println);;


這個就是簡單的的lambda運算式,lambda其實和函數式介面聯絡是比較多的,java8裡也有好多的類是函數式介面,什麼是函數式介面?函數介面指的就是只有一個函數的介面,是不是很繞口,這又有什麼關係?我也說不清楚,函數式介面是可以自訂的,一般再介面最上方加上@FunctionalInterface這個註解,就是函數式介面了,一般函數介面是不準許有其他的函數,但是預設方法和靜態方法可以排除,以前java介面裡沒有看到可以寫方法的,java8裡可以寫預設方法。


下面簡單寫一個預設方法和抽象方法,

private interface DefaultInterface {default String defaultMethod() {return "default method";}}private interface DefaultInterfaceStatic {    static String staticMethod() {return "static method";}}


有時間的同學看一下 Collection<E> 這個介面裡的東西,這個集合介面裡有一些用到預設方法的實現,有一些是它本身內建的,有些是繼承 Iterable<T> 這個介面而覆蓋了這個介面裡的預設方法。例如:

 default Stream<E> stream() {        return StreamSupport.stream(spliterator(), false);    }


同學們可以自己動手寫寫函數式介面,和介面裡的預設方法,嘗試一下,本身自己的項目是否可以修改成這樣的。


重複註解:

java 8 也可以定義重複註解,java本身是支援自自訂註解的,比如如下

@Target({ ElementType.METHOD, ElementType.TYPE })@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface Test {        String test() default "無";}

這就是一個自訂註解。


java8 定義重複註解,

 @Repeatable( Filters.class )

註解上加上這個,則可以定義重複註解,不過一般公司開發或者大型公司開發,自訂註解是比較多,但是重複註解有什麼用,我還是沒搞懂,所以這塊就簡單介紹了一下,怎麼定義就行,重複註解什麼情境使用我就不太清楚了。


Streams

這個特性可能是java 8 裡比較進階的一個特性,用java邊寫的時候,集合往往用的是最多的,寫一個介面很大可能會涉及到集合。通常集合的迭代邏輯都是for迴圈,Streams則是隱藏了這種操作,簡化了開發。再java8以前的集合都是載入記憶體中的,非常佔用內用,但是又不得不使用,Streams則是再訪問的時候才開始計算出來。

什麼是Streams?下面幾個簡單的例子來解釋

List<String> list = Arrays.asList("sdc","zs","ls","ww");這樣就是一套流list.stream().filter(s -> s.startsWith("s")).map(String::toUpperCase).sorted().forEach(System.out::println);也可以這樣Arrays.asList("sdc","zs","ls","ww").stream().findFirst().ifPresent(System.out::println);


streams包含中間和最終兩種形式的操作,中間操作返回的還是一個streams,但是不會有輸出,最總操作是返回有結果的。上面寫的map,sorted,findFirst都是中間操作,如果不加後面的話就會沒有輸出操作,大多數的streams操作都是可以使用lambda運算式的。


Streams類有順序的streams和並行的streams,並行一看就是多線程的類,適合在多線程中用。

//Arrays.asList("sdc","zs","ls","ww").stream().findFirst().ifPresent(System.out::println);//Stream.of("sdc","zs","ls","ww").findFirst().ifPresent(System.out::println);//IntStream.range(1, 4).forEach(System.out::println);//Arrays.stream(new int[]{4,5,6}).map(n -> 2*n +1).average().ifPresent(System.out::println);//IntStream.range(1, 4).mapToObj(p -> "sucess" + p).forEach(System.out::println);//Stream.of(100.0, 200.0, 300.0).mapToInt(Double::intValue).mapToObj(h -> h+"str").forEach(System.out::println);//Stream.of(12,21,13,31).filter( s -> {System.out.println("out:" +s); return true;});//Stream.of(12,21,13,31).filter( s -> {System.out.println("out:" +s); return true;}).forEach(System.out::println);;//Stream.of("ds","qw","ty","op","as")//.map(s -> {//System.out.println("map:" + s);//return s.toUpperCase();//})//.filter(s -> {//System.out.println("filter:" + s);//return s.startsWith("Q");//})//.forEach(s -> {//System.out.println("foreach:" + s);//});//Stream.of("ds","qw","ty","op","as")//.filter(s -> {//System.out.println("filter:" + s);//return s.startsWith("q");//})//.map(s -> {//System.out.println("map:" + s);//return s.toUpperCase();//})//.forEach(s -> {//System.out.println("foreach:" + s);//});//Stream.of("ds","qw","ty","op","as")//.sorted((s1, s2) -> {//System.out.println("sorted:" + s1 +"," +s2);//return s1.compareTo(s2);//})//.filter(s -> {//System.out.println("filter:" + s);//return s.startsWith("q");//})//.map(s -> {//System.out.println("map:" + s);//return s.toUpperCase();//})//.forEach(s -> {//System.out.println("foreach:" + s);//});//Stream.of("ds","qw","ty","op","as")//.filter(s -> {//System.out.println("filter:" + s);//return s.startsWith("q");//})//.sorted((s1, s2) -> {//System.out.println("sorted:" + s1 +"," +s2);//return s1.compareTo(s2);//})//.map(s -> {//System.out.println("map:" + s);//return s.toUpperCase();//})//.forEach(s -> {//System.out.println("foreach:" + s);//});//Stream<String> stream = Stream.of("a1", "d3", "i9","r8").filter( s-> s.startsWith("i"));//stream.anyMatch(s -> true);//stream.noneMatch(s -> true);//Supplier<Stream<String>> streamSupplier = () ->Stream.of("a1", "d3", "i9","r8").filter( s-> s.startsWith("i"));//streamSupplier.get().anyMatch(s -> true);//streamSupplier.get().noneMatch(s -> true);//stream 的進階特性List<User> userList = Arrays.asList(new User("sdc", 20), new User("zhangsan", 20), new User("lisi", 34));//List<User> newList = userList.stream().filter(u -> u.getUser().startsWith("s")).collect(Collectors.toList());//Set<User> set = userList.stream().filter(u -> u.getUser().startsWith("s")).collect(Collectors.toSet());//System.out.println(set);//Map<Integer, List<User>> userGMap = userList.stream().collect(Collectors.groupingBy(u -> u.getAge()));//userGMap.forEach((age, p) -> {//System.out.println(age + "||" + p);//});//double averrage = userList.stream().collect(Collectors.averagingInt(u -> u.getAge()));//System.out.println(averrage);//String phrase = userList.stream().filter(u -> u.getAge() >=19).map(p -> p.getUser()).collect(Collectors.joining(" and ", " in ", " high age "));//System.out.println(phrase);


這些是基本的一些方法,我覺得還是自己用用,實戰一下,可能很多人都不太習慣這些操作。





JAVA 8 新特性 (值得學習)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.