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缺点

  • 没法中断循环
  • 代码异常没法定位到匿名内部类中具体行数
相关文章
相关标签/搜索