1. 程式人生 > >java的lambda表示式 和stream介面使用

java的lambda表示式 和stream介面使用

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方式:

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

可以看出使用lambda會使程式碼更加簡潔優美。

集合迴圈

普通集合迴圈:

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

使用lambda方式:

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

Collection介面的stream方法

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

迴圈

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

過濾

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

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

list轉換成map

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;
	}
));

集合去重

集合中存放的是物件,根據物件屬性去重

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

屬性判斷

//任意一個匹配
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();

map

map介面接收一個值,並返回一個值。

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

reduce

reduce主要用來計算,比如說我需要求出學生資訊中最高分。

//接上面的資訊map,我們改寫成求最大分數
Optional<Integer> maxScore=data.stream().map(Student::getScore()).reduce(Integer::max);

注意reduce返回的是Optional型別,這是java8中新新增的,主要