Lambda-簡化程式碼之神
阿新 • • 發佈:2018-11-09
最近在開發的過程中,發現了大量的lambda表示式,看著帥氣而有簡潔的程式碼,我也有點心動了,於是學習了其用法,lambda概念以及特點我在這裡就不多作概述了,不懂的朋友可以自行去了解下,在這裡我直接上程式碼,不喜無噴!!
一:新增一些基類和原始資料
public class Deptment {
private String name;
private String address;
//省略setter,getter等方法
}
public class Person { private String firstName; private String lastName; private String job; private String gender; private int salary; private int age; //省略setter,getter等方法 }
//測試類 public class TestMain { private static List<Person> javaProgrammers; static { javaProgrammers = new ArrayList<Person>() { { add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000)); add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500)); add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800)); add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600)); add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200)); add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900)); add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300)); add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700)); add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000)); add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300)); } }; } public static void main(String[] args) { //在此執行下面的操作 } }
1、forEach():遍歷
javaProgrammers.forEach( p -> {
System.out.println(p);
});
2、map():改變集合中的資料後得到新的集合
//獲取所有姓名 List<String> list = javaProgrammers.stream() .map(p -> p.getFirstName()) .collect(Collectors.toList());
2.1、peek():改變原有集合中的某個屬性值,其餘值不變
//每個程式設計師的工資改為5000
List<Person> list = javaProgrammers.stream()
.peek(p -> p.setSalary(5000))
.collect(Collectors.toList());
3、filter():過濾
//查詢月薪超過 $1,400 的PHP程式設計師
List<Person> list9 = phpProgrammers.stream()
.filter(p -> p.getSalary() >1400)
.collect(Collectors.toList());
//下面是年齡大於 34歲且月薪在$1,400以上的女PHP程式設計師
List<Person> list3 = phpProgrammers.stream()
.filter(p -> p.getAge() > 34)
.filter(p -> p.getSalary() >1400 )
.collect(Collectors.toList());
//重用filter ,年齡大於 24歲的女性 Java programmers:
Predicate<Person> ageFilter = (p) -> (p.getAge() > 25);
Predicate<Person> salaryFilter = (p) -> (p.getSalary() > 1400);
Predicate<Person> genderFilter = (p) -> ("female".equals(p.getGender()));
List<Person> list4 = javaProgrammers.stream()
.filter(ageFilter)
.filter(genderFilter)
.collect(Collectors.toList());
4、limit():限制集合個數
//獲取前三個資料
List<Person> list3 = javaProgrammers.stream()
.limit(3)
.collect(Collectors.toList());
5、sorted():排序
//按照姓名排序(字串排序)
List<Person> list5 = javaProgrammers.stream()
.sorted((p1,p2) -> p1.getFirstName().compareTo(p2.getFirstName()))
.collect(Collectors.toList());
//按照工資排序(數值排序)
List<Person> list6 = javaProgrammers.stream()
.sorted((p1,p2) -> p1.getSalary()- p2.getSalary())
.collect(Collectors.toList());
6、min():最小的一個數據,max():最大的一個數據
//工資最低的 Java programmer
Person person8 = javaProgrammers.stream()
.min((p1,p2) -> p1.getSalary() -p2.getSalary())
.get();
7、getMax():計算集合中的最大值; getMin():計算集合中的最小值; getSum():計算集合中的總和; getAverage():計算集合中 的平均值;
//最低工資是多少
long min = javaProgrammers.stream()
.mapToInt(p -> p.getSalary()).summaryStatistics()
.getMin();
8、joining():將資料拼接
//將所有姓名以逗號隔開拼接
String collect = javaProgrammers.stream()
.map(p -> p.getFirstName())
.collect(Collectors.joining(","));
9、toMap():集合轉map
//以姓名為可以,Person為value
Map<String, Person> map = javaProgrammers.stream()
.collect(Collectors.toMap(
Person::getFirstName,//key
p -> p,//value
(v,u) -> v)//避免重複,可以不寫
);
10、groupingBy():分組
//以性別為key,List<Person> 為value
Map<String, List<Person>> map2 =javaProgrammers.stream()
.collect(Collectors.groupingBy(Person::getGender));
11、flatMap():和map功能相似,但是其是將stream合併
//新增一些資料
List<Person> list = new ArrayList<>();
Person person1 = new Person("Jarrod", "Pace", "PHP programmer", "male", 34, 1550);
Person person2= new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200);
Deptment deptment1 = new Deptment("研發一部", "深圳");
Deptment deptment2 = new Deptment("研發二部", "上海");
Deptment deptment3 = new Deptment("研發三部", "北京");
Deptment deptment4 = new Deptment("研發四部", "廣州");
List<Deptment> list1 = new ArrayList<>();
List<Deptment> list2 = new ArrayList<>();
list1.add(deptment1);
list1.add(deptment2);
list2.add(deptment3);
list2.add(deptment4);
person1.setDepts(list1);
person2.setDepts(list2);
list.add(person1);
list.add(person2);
list.stream().forEach(System.out::println);
//列印結果
Person [firstName=Jarrod, lastName=Pace, job=PHP programmer, gender=male, salary=1550, age=34, depts=[Deptment [name=研發一部, address=深圳], Deptment [name=研發二部, address=上海]]]
Person [firstName=Vere, lastName=Hervey, job=Java programmer, gender=male, salary=1200, age=22, depts=[Deptment [name=研發三部, address=北京], Deptment [name=研發四部, address=廣州]]]
//需求,獲取所有的Deptment,利於map()得到結果如下
List<List<Deptment>> list7 = list.stream().map(p -> p.getDepts()).collect(Collectors.toList());
list7.forEach(System.out::println);
//結果
[Deptment [name=研發一部, address=深圳], Deptment [name=研發二部, address=上海]]
[Deptment [name=研發三部, address=北京], Deptment [name=研發四部, address=廣州]]
//利於flatMap()得到結果如下
List<Deptment> list8 = list.stream().flatMap(p -> p.getDepts().stream()).collect(Collectors.toList());
//結果
Deptment [name=研發一部, address=深圳]
Deptment [name=研發二部, address=上海]
Deptment [name=研發三部, address=北京]
Deptment [name=研發四部, address=廣州]
//結論:map()將多個集合合併成一個新的集合,該新的集合裡還是集合,flagMap()是將多個集合合併成
//一個新的集合,該集合中的資料不再是集合,而是更細粒度的資料。
12、自定義返回值型別
//為每個java程式設計師漲1倍的薪水
List<Person> collect = javaProgrammers.stream()
.collect(ArrayList<Person>::new,//返回值型別
(list,person) -> {//第一個引數為返回值型別,第二個引數為原集合中的物件
person.setSalary(person.getSalary() * 2);
list.add(person);
},
(a,b) -> a.addAll(b)//a代表最後返回值型別,b代表第二部的list
// (a,b) -> a.addAll(b)也可以用ArrayList::addAll替代
);