stream 流去重函数式方法


public static void main(String[] args) {
        List<User> list=new ArrayList<>();
        User user = new User();
        user.setPassword("1242");
        user.setNickName("xkk");
        user.setType("sucess");
        User user1 = new User();
        user1.setPassword("1242");
        user1.setNickName("xkk");
        user1.setType("faile");
        User user2 = new User();
        user2.setPassword("666");
        user2.setNickName("xqq");
        user2.setType("dis");
        list.add(user);
        list.add(user1);
        list.add(user2);

       list.stream().
               filter(distinctByKey(new Function<User, Object>() {
            @Override
            public Object apply(User user) {
                return user.getPassword()+":"+user.getNickName();
            }
        })).collect(Collectors.toList());
    }

    public static  Predicate distinctByKey(Functionsuper T, Object> keyExtractor) {
        Map<Object, Boolean> seen = new HashMap<>();
        System.out.println("调用次数.........");
        return new Predicate() {
            @Override
            public boolean test(T t) {
                return seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) ==null;
            }
        };
    }

问题是distinctByKey 方法中的Map为什么之声明了一次

你可以试着debug一下,在调用次数和 seen.putIfAbsent 这里分别打个断点,你会发现 Map<Object, Boolean> seen = new HashMap<>(); 只执行了一次,而里面的函数式方法是调用了三次。

是的,别人问这里不应该是多次调用distinctByKey这个方法吗 该怎么给别人解释这块