java中lambda(函數語言程式設計)一行解決foreach迴圈
阿新 • • 發佈:2019-02-13
首先給大家推薦《精通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方法原始碼實現/** * 呼叫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方法
* 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迴圈的用法,有什麼問題可以留言,互相探討