1. 程式人生 > >JAVA 8 新特性 (值得學習)

JAVA 8 新特性 (值得學習)

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)
@Documented
public @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 新特性 (值得學習)