Chain of Map方法参考

mos*_*aab 27 java lambda java-8

我正在使用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);
Run Code Online (Sandbox Code Playgroud)

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

Mis*_*sha 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))
Run Code Online (Sandbox Code Playgroud)

要么

static<T,R> Function<T,R> func(Function<T,R> f) {
    return f;
}

stream.map(func(Status::getUser).andThen(User::getId))
Run Code Online (Sandbox Code Playgroud)

  • 实际上,两种方法都做了两次调用`map`的方法,唯一的区别是流总是使用`Function.andThen`或`Function.compose`而不是自己重新实现它(就像你的`chain`方法). (2认同)

eri*_*son 5

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

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

stream.map(((Function<Status, User>) Status::getUser).andThen(User::getId))
  .forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

或者

Function<Status, User> toUser = Status::getUser;
stream.map(toUser.andThen(User::getId)).forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

缺点是,为了使用它们,必须显式给出函数接口类型。这需要演员阵容或任务,而且看起来有点难看。所以对于映射链,我通常会使用多次map()调用。