Lambda表示式和Stream類的使用

2021-08-26 18:02:51 字數 4013 閱讀 8036

lambda表示式也叫閉包,允許把函式作為乙個方法的引數,可以將**變得簡介緊湊,核心思想是將物件導向中的傳遞資料變成傳遞行為。對於只有單一方法的匿名類會顯得很繁瑣,lambda表示式可以讓我們直接將某種功能作為引數,可以讓上面的行為變得更加簡潔。關於lambda官方詳細文件戳這裡。

1.基本語法為expression=(parameters) -> action(引數、箭頭、動作實現):

// 方式1

(parameters) -> expression

// 方式2

(parameters) ->

【說明】

2.使用場景,下面是一些用例**:

public

class

lambdatest ;

// 沒有大括號及返回語句

mathoperation div = (a, b) -> a / b;

system.out.println(lambdatest.operate(2, 3, add));

system.out.println(lambdatest.operate(3, 2, sub));

system.out.println(lambdatest.operate(2, 3, multi));

system.out.println(lambdatest.operate(10, 5, div));

string hello = "hello ";

greetingservice greetingservice = message -> system.out.println(hello + message);

greetingservice.saymessage("china");

greetingservice.saymessage("janey");

// 用()->{}代替匿名類

new thread(() -> system.out.println("lambda")).start();

listlist = arrays.aslist(new string);

// 遍歷list的方法1

list.foreach(l -> system.out.println(l));

system.out.println("***************==");

// 遍歷list的方法2,其中::代表方法引用的操作符

list.foreach(system.out::println);

// 排序,其實有點類似上面的匿名類

comparatorstringcomparator = (str1, str2) -> str1.compareto(str2);

list.sort(stringcomparator);

}inte***ce mathoperation

inte***ce greetingservice

private

intoperate(int a, int b, mathoperation mathoperation)

}

關於上述的方法引用操作符是::,基本是下面的形式:

objectname::instancemethod

classname::staticmethod

classname::instancemethod

在遍歷list時用到的system.out::printlnx -> system.out.println(x)是一樣的,math::max就等同於(x,y) -> math.max(x,y)

這一塊結合昨天遇到的stream很好用,stream是乙個來自資料來源的元素佇列並支援聚合操作:

下面是之前寫的一些常用方法的案例:

// 初始化乙個流

stream stream = stream.of("a", "b", "c");

// 將陣列轉化為乙個流

string arr = new string;

stream stream1 = stream.of(arr);

// 將乙個集合物件轉為乙個流

listlist = arrays.aslist(arr);

stream stream2 = stream.of(list);

object collect = stream2.sorted().collect(collectors.tolist());

// 1.1 map方法實現遍歷對映操作(有點類似於覆蓋源資料的意思),collect方法是得到操作後的集合

listlist1 = list.stream().map(string::touppercase).collect(collectors.tolist());

system.out.println(list1);

// 1.2 更新值

listlist2 = list.stream().map(s -> s + "ha").collect(collectors.tolist());

system.out.println(list2);

// 1.3 遍歷還可以直接用foreach

stream.foreach(s -> system.out.println(s));

// 2.1 利用filter進行過濾,對過濾後的流再使用collect方法轉成對應的集合

listlist3 = list.stream().filter(s -> !s.contains("c")).collect(collectors.tolist());

system.out.println(list3);

// 3. 對流進行忽略或者limit操作(類似於mysql中limit),skip(2)就是跳過流的前2個,返回前1個

listlist4 = list.stream().skip(2).limit(1).collect(collectors.tolist());

system.out.println(list4);

// 4. 排序

listlist5 = list.stream().sorted().collect(collectors.tolist());

system.out.println(list5);

// 5. 去重,distinct方法可以將流中的重複元素去除

listlist6 = list.stream().distinct().collect(collectors.tolist());

system.out.println(list6);

// 6. 匹配, allmatch、anymatch、nonematch

// 6.1 anymatch只要有乙個元素符合predicate(這裡就是a)就返回true

boolean anymatch = list.stream().anymatch(s -> s.equals("i"));

system.out.println(anymatch);

// 6.2 nonematch匹配不滿足條件的,只有全部不滿足才返回true

boolean nonematch = list.stream().nonematch(s -> s.contains("a"));

system.out.println(nonematch);

// 6.3 allmatch匹配滿足條件的,只有全部滿足條件的才返回true

boolean allmatch = list.stream().allmatch(s -> s.contains("b"));

system.out.println(allmatch);

listintegers = filterversions(2017);

system.out.println(integers);

Lambda表示式和Lambda表示式樹

原版來自 linq學習筆記之二 lambda表示式和lambda表示式樹 lambda 表示式 lambda expressions 是linq實現的另一特性。lambda表示式的作用就是使用使用函式式語法,將方法實現關聯到委託例項。在使用查詢表示式 query expressions 時,查詢表示...

lambda表示式 lambda表示式

1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...

LINQ和Lambda表示式

前段時間接觸了一種新的表示式,但是不知道這個是什麼意思,所以就先站在巨人的肩膀用了,現在聽師哥說這種寫法是 lambda 表示式。我一直以為,這個 lambda 表示式和 linq 查詢有異曲同工之妙,可惜,這樣想就大錯特錯了。定義語言整合查詢 language integrated query 允...