Lambda在jdk1.8
裏面已經很好用了,在這裏不講底層的實現,只有簡單的用法,會繼續補全。
首先一個list咱們要使用lambda
的話,須要使用它的stream()
方法,獲取流,才能使用後續的方法。java
public class User { public long userId; public User() { } public User(long userId, String name, int age) { this.userId = userId; this.name = name; this.age = age; } public String name; public int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public long getUserId() { return userId; } public void setUserId(long userId) { this.userId = userId; } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", age=" + age + ", userId=" + userId + '}'; } public void output() { System.out.println("User{" + "name='" + name + '\'' + ", age=" + age + ", userId=" + userId + '}'); } }
使用foreach方法,其中s->
裏面的s指list裏面的每個元素,針對每個元素都執行後續的方法。若是裏面只有一句話,能夠直接縮寫foreach(n -> System.out.println(n));
,若是須要執行的方法裏面有兩句或者多句須要執行的話,須要可使用list.stream().forEach(s -> {System.out.println(s);});
形式。ide
// 遍歷list(String)和對象 public static void foreachListString() { List features = Arrays.asList("Lambdas", "Default Method", "Stream API", "Date and Time API"); features.forEach(n -> System.out.println(n)); List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); // s表明的是裏面的每個元素,{}裏面就是每一個元素執行的方法,這個比較容易理解 list.stream().forEach(s -> { System.out.println(s); }); // 處理對象 List<User> users = new ArrayList<>(); User user1 = new User(); user1.setAge(1); user1.setName("user1"); user1.setUserId(1); users.add(user1); users.stream().forEach(s -> s.output()); }
map是須要返回值的,s表明裏面的每個元素,return 處理後的返回值函數
public static void mapList() { List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("c"); List<String> list2 = new ArrayList<>(); // map表明從一個轉成另外一個,s表明裏面的每個值,{}表明針對每個值的處理方法,若是是代碼句子,則須要有返回值 // 返回值表明轉化後的值,如下兩種均可以 list2 = list.stream().map(s -> { return s.toUpperCase(); }).collect(Collectors.toList()); list2.stream().forEach(s -> { System.out.println(s); }); list2 = list.stream().map(s -> s.toUpperCase()).collect(Collectors.toList()); list2.stream().forEach(s -> { System.out.println(s); }); }
使用filter函數,裏面的表達式也是須要返回值的,返回值應該爲boolean類型,也就是符合條件的就保留在list裏面,不符合條件的就被過濾掉。學習
// filter過濾 public static void filterList() { List<String> list1 = new ArrayList<>(); List<String> list2 = new ArrayList<>(); list1.add("aasd"); list1.add("agdfs"); list1.add("bdfh"); list2 = list1.stream().filter(s -> { return s.contains("a"); }).collect(Collectors.toList()); list2.stream().forEach(s -> { System.out.println(s); }); }
這個可讓咱們取出list集合中的某一個元素,也是使用map便可。this
// list集合中取出某一屬性 public static void getAttributeList() { List<User> list = new ArrayList<>(); User user1 = new User(); user1.setUserId(1); user1.setName("James"); user1.setAge(13); list.add(user1); User user2 = new User(); user2.setUserId(2); user2.setName("Tom"); user2.setAge(21); list.add(user2); // 兩種書寫方式均可以,一個是map裏面,使用每個實例調用User類的getName方法返回值就是轉化後的值。 List<String> tableNames = list.stream().map(User::getName).collect(Collectors.toList()); tableNames.stream().forEach(s -> { System.out.println(s); }); List<String> tableNames1 = list.stream().map(u -> u.getName()).collect(Collectors.toList()); tableNames1.stream().forEach(s -> { System.out.println(s); }); }
能夠根據某一個屬性來分組,得到map
code
// 分組,每一組都是list public static void groupBy() { List<User> userList = new ArrayList<>();// 存放user對象集合 User user1 = new User(1, "張三", 24); User user2 = new User(2, "李四", 27); User user3 = new User(3, "王五", 21); User user4 = new User(4, "張三", 22); User user5 = new User(5, "李四", 20); User user6 = new User(6, "王五", 28); userList.add(user1); userList.add(user2); userList.add(user3); userList.add(user4); userList.add(user5); userList.add(user6); //根據name來將userList分組 Map<String, List<User>> groupBy = userList.stream().collect(Collectors.groupingBy(User::getName)); System.out.println(groupBy); }
好比咱們須要對年齡進行求和,可使用mapToInt(),裏面參數應該使用類名:方法名
,最後須要使用sum()來求和。對象
public static void getSum(){ List<User> userList = new ArrayList<>();//存放user對象集合 User user1 = new User(1, "qw", 24); User user2 = new User(2, "qwe", 27); User user3 = new User(3, "aasf", 21); User user4 = new User(4, "fa", 22); User user5 = new User(5, "sd", 20); User user6 = new User(6, "yr", 28); userList.add(user1); userList.add(user2); userList.add(user3); userList.add(user4); userList.add(user5); userList.add(user6); // sum()方法,則是對每個元素進行加和計算 int totalAge = userList.stream().mapToInt(User::getAge).sum(); System.out.println("和:" + totalAge); }
好比咱們須要list裏面的對象的id和這個對象對應,那就是須要轉換成map。須要在collect()方法裏面使用Collectors的toMap()方法便可,參數就是key和value。get
public static void listToMap(){ List<User> userList = new ArrayList<>(); User user1 = new User(1, "12", 22); User user2 = new User(2, "21", 17); User user3 = new User(3, "a", 11); User user4 = new User(4, "a", 22); User user5 = new User(5, "af", 22); User user6 = new User(6, "fa", 25); userList.add(user1); userList.add(user2); userList.add(user3); userList.add(user4); userList.add(user5); userList.add(user6); Map<Long,User> userMap = userList.stream().collect(Collectors.toMap(User::getUserId, user -> user)); System.out.println("toMap:" + userMap.toString()); }
此文章僅表明本身(本菜鳥)學習積累記錄,或者學習筆記,若有侵權,請聯繫做者刪除。人無完人,文章也同樣,文筆稚嫩,在下不才,勿噴,若是有錯誤之處,還望指出,感激涕零~table
技術之路不在一時,山高水長,縱使緩慢,馳而不息。class
公衆號:秦懷雜貨店