標籤: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 新特性 (值得學習)