Java 映射方法引用链

Java 映射方法引用链,java,lambda,java-8,Java,Lambda,Java 8,我和Twitter4J一起工作。但我要问的问题更一般。我想访问给定tweet的用户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::prin

我和Twitter4J一起工作。但我要问的问题更一般。我想访问给定tweet的用户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表达式,也不喜欢第二个选项中被迫调用两个
映射。有没有一种方法可以生成方法引用链?我知道状态::getUser::getId不起作用,但我想知道是否有替代方法。

没有,这是两种方法。其他任何事情最终都会变得不那么清晰

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

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))
静态功能链(

函数在建议的两个选项中,我倾向于使用第二个,将调用链接到
map()

还有其他选项,它们使用内置API而不是帮助器方法,如or方法所示,您可以链接函数调用。
谓词
和其他函数接口实现类似的默认方法

stream.map(((Function<Status, User>) Status::getUser).andThen(User::getId))
  .forEach(System.out::println);
stream.map(((函数)Status::getUser)。然后(User::getId))
.forEach(System.out::println);
或者

Function<Status, User> toUser = Status::getUser;
stream.map(toUser.andThen(User::getId)).forEach(System.out::println);
函数toUser=Status::getUser;
stream.map(toUser.andThen(User::getId)).forEach(System.out::println);

缺点是,为了使用它们,必须显式地给出函数接口类型。这需要强制转换或赋值,而且看起来有点难看。因此对于映射链,我通常使用multiple
map()
调用。

为什么不喜欢2个
map
调用?您担心性能吗?您不必担心-流将在一次过程中处理。详细。出于相同的原因
status.getUser().getId()
存在,我希望像
Status::getUser::getId
这样的东西存在。实际上,这两种方法都做了调用
map
两次所做的事情,唯一的区别是流将始终使用
函数。然后使用
函数。编写
而不是重新实现它本身(就像你的
chain
方法一样)。我一直在寻找避免调用类
User
,因为它应该直接从
getUser
推断出来。我接受“Nope”作为答案。
Function<Status, User> toUser = Status::getUser;
stream.map(toUser.andThen(User::getId)).forEach(System.out::println);