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 super T, ? extends U> f1, Function super U, ? extends R> 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()
调用。