有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java映射方法引用链

我和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表达式,也不喜欢在第二个选项中被迫调用两个maps。有没有一种方法可以生成方法引用链?我知道Status::getUser::getId不起作用,但我想知道是否有其他选择


共 (2) 个答案

  1. # 1 楼答案

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

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

    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))
    
  2. # 2 楼答案

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

    还有其他选项,它们使用内置API而不是帮助器方法,如here.所示。使用^{}^{}方法,可以链接函数调用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()调用