Map of Map方法引用

我正在使用Twitter4J。 但我问的问题更为笼统。 我想访问给定推文的用户ID。 目前,我有以下两种选择:

//Option 1 stream.map(status -> status.getUser().getId()) .forEach(System.out::println); //Option 2: stream.map(Status::getUser) .map(User:getId) .forEach(System.out::println); 

我不喜欢第一个选项中的lambda表达式,也不想在第二个选项中调用两个maps 。 有没有办法建立一系列方法参考? 我知道Status::getUser::getId不起作用,但我想知道是否有替代品。

不,这是两种方式。 其他任何东西最终都会变得不那么清晰。

但是,既然你问过,这里有一些选择。

 static Function chain( Function f1, Function f2) { return t -> f2.apply(f1.apply(t)); } stream.map(chain(Status::getUser, User::getId)) 

要么

 static Function func(Function f) { return f; } stream.map(func(Status::getUser).andThen(User::getId)) 

在提出的两个选项中,我倾向于使用第二个链接调用map()

还有其他选项,使用内置API而不是辅助方法,如此处所示。 使用Function.compose()Function.andThen()方法,您可以链接函数调用。 Predicate和其他function接口实现类似的默认方法。

 stream.map(((Function) Status::getUser).andThen(User::getId)) .forEach(System.out::println); 

另外

 Function toUser = Status::getUser; stream.map(toUser.andThen(User::getId)).forEach(System.out::println); 

缺点是,为了使用这些,必须明确给出function接口类型。 这需要演员或任务,看起来有点难看。 因此对于映射链,我通常使用多个map()调用。