java的lambda表達式 和stream接口使用

什麼是lambda

Lambda 容許把函數做爲一個方法的參數,使用 Lambda 表達式能夠使代碼變的更加簡潔緊湊。java

lambda格式

method(param->表達式);

//或者
method(param->{
	語句塊;
});

示例

List<String> list=Lists.newArrayList();
list.add("jack");
list.add("test");
//表達式示例:判斷是否有匹配
boolean match=list.stream().anyMatch(item->item.equals("test"));

//語句塊示例:循環
 list.stream().forEach(item->{
 	String sayHi="hi,"+item;
 	System.out.println(sayHi);
 });

多線程示例

接下來咱們看一下使用lambda方式新建線程。
普通新建一個線程:多線程

new Thread(new Runnable() {
	@Override
	public void run() {
	System.out.println("do something");
	}
}).start();

使用lambda方式:ide

new Thread(() -> System.out.println("do something")).start();

能夠看出使用lambda會使代碼更加簡潔優美。函數

集合循環

普通集合循環:線程

List<String> names = Lists.newArrayList();
for (String name : list) {
	System.out.println(name);
}

使用lambda方式:3d

names.stream().forEach(name-> System.out.println(name));

Collection接口的stream方法

集合下的stream方法有多種用處,下面舉幾個經常使用的例子:指針

集合循環

list.stream().forEach(item->{.....})

Map循環

notExistsSchool.entrySet().stream().forEach(item -> {
	dosomething
});

List過濾

根據條件過濾,並返回一個新的集合code

list=list.stream().filter(item->{
	return item.equals("test")?false:true;
}).collect(Collectors.toList());

list轉換成map-value覆蓋

//key是屬性,value是對象
Map<Long, User> entityMap= userList.stream().collect(Collectors.toMap(User::getId,
	Function.identity(),(entity1,entity2) -> entity1));
	
//key是屬性,value也是屬性
Map<String ,String > grandClass=dataList.stream().collect(Collectors.toMap(User::getUserId, 
	User::getUserName,(entity1,entity2) -> entity1));

list轉換成map-value合併

list對象中的一個屬性做爲key,相同的key合併成一個集合。對象

  • 定義entity:
public class StudentEntity {
    private String className;
    private String studentName;
}
  • 進行轉換:
Map<String, List<StudentEntity>> stuMap = stuList.stream().collect(Collectors.toMap(
	//對key的處理方式,此處返回className
	StudentEntity::getClassName,
	
	//對value的處理方式,轉換成一個集合
	stu -> {
	List<StudentEntity> list = new ArrayList<>();
	list.add(stu);
	return list;
	},
	
	//對重複的key進行的操做,進行合併
	(oldList, newList) -> {
	oldList.addAll(newList);
	return oldList;
	}
));

map轉換list

List<Long> list= roomMap.entrySet().stream().map(item ->item.getValue()).collect(Collectors.toList());

集合去重-屬性

集合中存放的是對象,根據對象屬性去重blog

List<String> gradeCodes = dataList.stream().map(ExcelStuBean::getGradeCode).distinct().collect(Collectors.toList());

集合去重-對象

若是集合中存在多個屬性相同的對象,去重須要重寫equals和hashcode方法。

//Test須要重寫equals和hashcode方法
 Test test0 = new Test("海淀一小", "一年級", "jack");
 Test test1 = new Test("海淀一小", "一年級", "jack");
 Test test2 = new Test("海淀一小", "一年級", "tom");
 Test test3 = new Test("海淀一小", "二年級", "ahuang");
 List<Test> list = Lists.newArrayList();
 list.add(test0);
 list.add(test1);
 list.add(test2);
 list.add(test3);

List<Test> distinctList = list.stream().map(stu -> {
	return stu;
}).distinct().collect(Collectors.toList());

distinctList.stream().forEach(item -> {
	System.out.println(JSONObject.toJSONString(item));
});

輸出信息以下:
集合去重

集合分組

Test test1 = new Test("海淀一小","一年級","jack");
 Test test2 = new Test("海淀一小","一年級","tom");
 Test test3 = new Test("海淀一小","二年級","ahuang");
 List<Test> list=Lists.newArrayList();
 list.add(test1);
 list.add(test2);
 list.add(test3);
 Map<String, List<Test>> collect = list.stream().collect(Collectors.groupingBy(Test::getClassName));
 collect.forEach((key,value)->{
 	System.out.println(key+": "+ JSONObject.toJSONString(value));
 });

集合分組

集合分組求和

在上面的"集合分組"例子中,咱們在Test對象裏面加入一個int類型的屬性count,以表示求和結果。

//單個屬性分組
        Map<String, IntSummaryStatistics> collect2 = list.stream().collect
                (Collectors.groupingBy(Test::getClassName, Collectors.summarizingInt(Test::getCount)));

        collect2.forEach((key,value)->{
            System.out.println(key+": "+ JSONObject.toJSONString(value));
        });

輸出信息以下:
單屬性分組求和

//多個屬性分組
        Map<String, IntSummaryStatistics> collect3= list.stream().collect
                (Collectors.groupingBy(item->{
                    return item.getSchoolName()+"-"+item.getClassName();
                }, Collectors.summarizingInt(Test::getCount)));

        collect3.forEach((key,value)->{
            System.out.println(key+": "+ JSONObject.toJSONString(value));
        });

輸出信息以下:
多屬性分組求和

成員屬性求sum

BigDecimal reduce = pList.stream().map(Person::getSalary).reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println("工資總計:" + reduce);

屬性判斷

//任意一個匹配
data.stream().anyMatch(item->item.getCity().equals("北京"));
//所有匹配
data.stream().allMatch(item->item.getCity().equals("北京"));

成員查找

//查找第一個
Optional<String> result = list.stream().findFirst();
//查找任意一個
Optional<String> result = list.stream().findAny();

LIST查詢屬性集合

map接口接收一個值,並返回一個值。

List<Long> ids = data.stream().map(Student::getId()).collect(Collectors.toList());
//此寫法等同於
List<Long> ids = data.stream().map(student->student.getId()).collect(Collectors.toList());

排序

//正排序
regions = regions.stream().sorted(Comparator.comparingInt(HomeworkWkRegion::getMarkingSort)).collect(Collectors.toList());
//倒排序
 regions = regions.stream().sorted(Comparator.comparingInt(HomeworkWkRegion::getMarkingSort).reversed()).collect(Collectors.toList());

求最大值

經過reduce計算,好比說我須要求出學生信息中最高分。

//接上面的信息map,咱們改寫成求最大分數
Optional<Integer> maxScore=data.stream().map(Student::getScore()).reduce(Integer::max);
//此寫法等同於
int maxScore=data.stream().map(Student::getScore()).reduce(Integer::max).orElse(0);

注意reduce返回的是Optional類型,這是java8中新添加的,主要是防止空指針。

strem缺點

  • 沒法中斷循環
  • 代碼異常沒法定位到匿名內部類中具體行數
相關文章
相關標籤/搜索