lamdba 过滤方法自定义过滤器

标题最近在使用lamdba表达式的时候遇到一个问题

List dataBaseList=........;
List result = dataBaseList.stream().filter(obj->{
	//这里通过对对象某些属性的判断通过返回 true fales的方式能过滤数组
	//常用于代替sql一些字段的简单过滤
}) .collect(Collectors.toList());
 
  

但是要注意过滤后的result 里面的对象指向的是dataBaseList的内存地址,如果改变result 的值会导致dataBaseList值发生变化,如果再次使用dataBaseList会导致值错误;

再说问题,此处想要实现一个List 去重的方法

贴一下源码
lamdba 过滤方法自定义过滤器_第1张图片
他的参数Predicate 没有神研究但是能够确定应该参数使用的是这个方法
lamdba 过滤方法自定义过滤器_第2张图片
lamdba 过滤方法自定义过滤器_第3张图片
同时这个接口有FunctionalInterface 是一个函数式接口

        List result = voucherItems.stream()
                .filter(distinctByAccountId(VoucherItem::getAccountId))
                .collect(Collectors.toList());
		
	/**
     * 过滤器作为filer的条件, 根据id去重list
     */
    public static  Predicate distinctByAccountId(Function keyExtractor) {
        Map seen = new ConcurrentHashMap<>();
        return object -> seen.putIfAbsent(keyExtractor.apply(object), Boolean.TRUE) == null;
    }

::其实是一个函数,自定义过滤器的参数是一个函数
.apply可以理解为函数式的取值,还有其他取值关于运算顺序不同

map的putIfAbsent方法如果key重复会返回已有key的值,没有则返回null

你可能感兴趣的:(java8)