1. 程式人生 > 實用技巧 >java8之常用新特性

java8之常用新特性

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和

總結:程式碼就是需要多學多練多敲,看的再多不如自己實踐,希望以後自己在實踐中講這些新特性都用起來吧