1. 程式人生 > >java中lambda(函數語言程式設計)一行解決foreach迴圈

java中lambda(函數語言程式設計)一行解決foreach迴圈

首先給大家推薦《精通lambda表示式:java多核程式設計》

這本書詳細介紹了lambda表示式從入門到理解、應用

下面介紹用以前的迴圈方式進行對比,來更加清晰地java函數語言程式設計中foreach的用法

一、以前我們使用的for迴圈

/**
     * for迴圈
     */
    @Test
    public void forTest() {
        // 例項化一個List
        List<Point> points = Arrays.asList(new Point(1, 2), new Point(2, 3));
        System.out.println("迴圈操作前:" + points);
        // for迴圈
        for (int i = 0; i < points.size(); i++) {
            points.get(i).translate(1, 1);
        }
        System.out.println("迴圈操作後:" + points);
    }

二、後來使用foreach迴圈(感覺爽多了)
/**
     * foreach迴圈
     */
    @Test
    public void forEachTest() {
        List<Point> points = Arrays.asList(new Point(1, 2), new Point(2, 3));
        System.out.println("迴圈操作前:" + points);
        // foreach 迴圈
        for (Point p : points) {
            p.translate(1, 1);
        }
        System.out.println("迴圈操作後:" + points);
    }

三、而大家可能很少了解ArrayList中的forEach方法,下面便是一個例項
/**
     * 呼叫ArrayList中foreach方法迴圈
     */
    @Test
    public void forEachMethodTest() {
        List<Point> points = Arrays.asList(new Point(1, 2), new Point(2, 3));
        System.out.println("迴圈操作前:" + points);
        /**
         * 此foreach為ArrayList中的方法
         * 接收的引數為Consumer介面
         */
        points.forEach(new Consumer<Point>() {
            public void accept(Point t) {
                t.translate(1, 1);
            }
        });
        System.out.println("迴圈操作後:" + points);
    }
ArrayList中的forEach方法原始碼實現
/**
     * ArrayList中的foreach方法
     * this為當前集合物件
     * Consumer接口裡面的accept方法是對集合中物件所做的操作
     * 底層依然是foreach迴圈實現的
     */
    default void forEach(Consumer<? super T> action) {
        Objects.requireNonNull(action);
        for (T t : this) {
            action.accept(t);
        }
    }
四、最後,逼格最高,寫法最簡潔,用起來最爽的函式式寫法
/**
     * lambdaForeach迴圈
     */
    @Test
    public void lambdaForEachTest() {
        List<Point> points = Arrays.asList(new Point(1, 2), new Point(2, 3));
        System.out.println("迴圈操作前:" + points);
        /**
         * 僅此一行就夠了
         * p -> p.translate(1, 1)
         * points集合的泛型為Point,裡面儲存的是Point物件
         * p即Point物件,箭頭後面的即對此物件所做的操作,當然這個p可以隨便命名
         * 比如Long型別的number: num -> sb.append(num + ",");
         * 場景是將一個id集合,使用StringBuilder拼接成逗號分隔的字串
         */
        points.forEach(p -> p.translate(1, 1));
        System.out.println("迴圈操作後:" + points);
    }
四種方式的執行結果:
迴圈操作前:[java.awt.Point[x=1,y=2], java.awt.Point[x=2,y=3]]
迴圈操作後:[java.awt.Point[x=2,y=3], java.awt.Point[x=3,y=4]]

以上便是對lambda中foreach迴圈的用法,有什麼問題可以留言,互相探討