我正在使用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
不起作用,但我想知道是否有替代方案。
答案 0 :(得分:17)
不,这是两种方式。其他任何东西最终都不会那么清楚。
但是,既然你问过,这里有一些选择。
static<T,U,R> Function<T,R> 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<T,R> Function<T,R> func(Function<T,R> f) {
return f;
}
stream.map(func(Status::getUser).andThen(User::getId))
答案 1 :(得分:4)
在提议的两个选项中,我倾向于使用第二个链接调用map()
。
还有其他选项,它使用内置API而不是辅助方法,如图所示here.使用Function.compose()
或Function.andThen()
方法,您可以链接函数调用。 Predicate
和其他功能接口实现类似的默认方法。
stream.map(((Function<Status, User>) Status::getUser).andThen(User::getId))
.forEach(System.out::println);
可选地
Function<Status, User> toUser = Status::getUser;
stream.map(toUser.andThen(User::getId)).forEach(System.out::println);
缺点是,为了使用它们,必须明确给出功能接口类型。这需要演员或任务,看起来有点难看。因此,对于映射链,我通常使用多个map()
调用。