java8之常用新特性
阿新 • • 發佈:2020-10-08
java8中新特性有很多哦,今天研究一番,把常用的幾個新特性列舉出來,有一篇寫的特別好的部落格,連結如下:https://blog.csdn.net/yczz/article/details/50896975
新特性之一》》lambda表示式+介面中可以實現預設方法或者靜態方法
lambda表示式的出現大大簡化了程式碼的冗餘,使得很多我們需要重寫方法的大量程式碼,僅僅使用簡潔的語言就可以實現。
這裡的注意事項就是對於介面中如果內部只有一個abstract方法,其餘的都是預設方法(default)或者靜態方法,這樣我們可以使用lambda表示式來實現。(需要注意的是,lambda表示式內部使用的變數會預設的加上final標識)
當然為了防止我們的lambda表示式不可用,我們可以在介面上加上@FunctionalInterface註解
新特性之二》》方法引用(更深刻的理解就是使得方法呼叫更加緊湊)【更加深入的理解就是為了更加簡化lambda表示式(也就是說它能使用的地方一定是支援lambda表示式的,但是反之可就不一定了哦)
最好的理解:方法引用是為了使用lambda表示式更加簡化
static class Car { //建立物件的時候都是使用Supplier這個類哦(當然也可以自己寫一個和這個類一樣的) public static Car create(Supplier<Car> supplier) {return supplier.get(); } public static void collide(Car car) { System.out.println("Collided " + car.toString()); } public void follow(Car another) { System.out.println("Following the " + another.toString()); } public void repair() { System.out.println("Repaired " + this.toString()); } } private void TestMethod2(){ Car car = Car.create(Car::new);//相當於呼叫無參建構函式 語法是Class::new List<Car> cars = Arrays.asList(car);//這樣foreach下的每一個就是Car物件嘛 cars.forEach(Car::collide);//靜態方法的引用(有一個引數) Class::static_method cars.forEach(Car::repair);//成員方法的引用(無入參) Class::method cars.forEach(new Car()::follow);//某個例項物件的成員方法的引用(有一個入參,入參就是foreach的每一個物件) instance::method }具體的四個使用在上方程式碼中都有標識
新特性之三》》Stream
Stream是位於Collection下的一個方法,它的出現讓我們的程式程式碼更加輕鬆實現篩選等功能(和我以前使用C#中List下一串的lambda表示式很像)
private static class Streams { private enum Status { OPEN, CLOSED }; private static final class Task { private final Status status; private final Integer points; Task( final Status status, final Integer points ) { this.status = status; this.points = points; } public Integer getPoints() { return points; } public Status getStatus() { return status; } @Override public String toString() { return String.format( "[%s, %d]", status, points ); } } private void TestMethod3(){ final Collection< Task > tasks = Arrays.asList( new Task( Status.OPEN, 5 ), new Task( Status.OPEN, 13 ), new Task( Status.CLOSED, 8 ) ); //stream是Collection下的方法 int sum = tasks.stream().filter(x -> x.getStatus() == Status.OPEN).mapToInt(Task::getPoints).sum(); System.out.println(sum); } public static void main(String[] args) { new Streams().TestMethod3(); } }上方程式碼統計了Status狀態為OPEN的points和
總結:程式碼就是需要多學多練多敲,看的再多不如自己實踐,希望以後自己在實踐中講這些新特性都用起來吧