1. 程式人生 > >Lambda-簡化程式碼之神

Lambda-簡化程式碼之神

 

最近在開發的過程中,發現了大量的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替代		  
			 );