java8中累积对的函数方法

java8中累积对的函数方法,java,functional-programming,java-8,java-stream,Java,Functional Programming,Java 8,Java Stream,下面是一些我试图翻译成函数式编程代码的命令代码: public class Person { String name; Token token; public Person(String name, Token token) { this.name = name; this.token = token; } } public class Token { String id; boolean isValid;

下面是一些我试图翻译成函数式编程代码的命令代码:

public class Person {
    String name;
    Token token;

    public Person(String name, Token token) {
        this.name = name;
        this.token = token;
    }
}
public class Token {
    String id;
    boolean isValid;
    public Token(String id, boolean isValid) {
        this.id = id;
        this.isValid = isValid;
    }
    public String getId() { return id; }
    public boolean isValid() {return isValid;}
}
public static List<Token> getTokensForPerson(String name) {...}


public static List<Person> getPeople1 (String[] names) {

    List<Person> people = new ArrayList<Person> ();
    for (String name: names) {
        List<Token> tokens = getTokensForPerson(name);
        for (Token token: tokens) {
            if (token.isValid()) {
                people.add(new Person(name, token));
            }
        }

    }
    return people;
}
公共类人物{
字符串名;
代币;
公众人物(字符串名称、令牌){
this.name=名称;
this.token=token;
}
}
公共类令牌{
字符串id;
布尔值是有效的;
公共令牌(字符串id,布尔值有效){
this.id=id;
this.isValid=isValid;
}
公共字符串getId(){return id;}
公共布尔值isValid(){return isValid;}
}
公共静态列表getTokensForPerson(字符串名称){…}
公共静态列表getPeople1(字符串[]名称){
List people=newarraylist();
for(字符串名称:名称){
List tokens=getTokensForPerson(姓名);
for(令牌:令牌){
if(token.isValid()){
添加(新人员(姓名、令牌));
}
}
}
还人,;
}
下面是我尝试用功能性的方法来做的

public static List<Person> getPeople2 (String[] names) {

    return Arrays.stream(names).map(name -> getTokensForPerson(name))
        .flatMap(tokens -> tokens.stream().filter(token -> token.isValid))
        .map(token -> new Person(name, token))   // <== compiler error here. "Cannot resolve symbol 'name'"
        .collect(Collectors.toList());
}
公共静态列表getPeople2(字符串[]名称){
返回array.stream(name).map(name->getTokensForPerson(name))
.flatMap(令牌->令牌.stream().filter(令牌->令牌.isValid))

.map(token->new Person(name,token))/您可以在
flatMap
中移动
map
步骤:

return Arrays.stream(names)
        .<Person>flatMap(
                name -> getTokensForPerson(name).stream()
                        .filter(Token::isValid)
                        .map(token -> new Person(name, token)))
        .collect(Collectors.toList());

是否可以创建
TokenExtended
类扩展令牌,添加名称,并从getTokensForPerson返回
列表,而不是
列表

这样你的代码就可以工作了

    Arrays.stream(names).map(name -> getTokensForPerson(name)).flatMap(tokens -> tokens.stream().filter(token -> token.isValid))
            .map(token -> new Person(token.name, token)).collect(Collectors.toList());
“命令”更好:)
public class TokenExtended extends Token {
    private String name;
    public TokenExtended(String name, String id, boolean isValid) {
        super(id, isValid);
        this.name = name;
    }
}
    Arrays.stream(names).map(name -> getTokensForPerson(name)).flatMap(tokens -> tokens.stream().filter(token -> token.isValid))
            .map(token -> new Person(token.name, token)).collect(Collectors.toList());