2017-05-29 82 views
1

鑑於這種類用Java 8的風格,我想看看,如果我不需要調用兩次流API:如何使用Java 8 Stream API從Java POJO獲取多個屬性?

import java.util.*; 

public class Foo { 

public static void main(String... args) { 
    List<Person> persons = new ArrayList<>(); 
    init(persons, Person::new, "John", "Doe"); 


    persons.stream() 
      .map(Person::getFirstName) 
      .forEach(System.out::println); 

    persons.stream() 
      .map(Person::getLastName) 
      .forEach(System.out::println); 
} 

@FunctionalInterface 
interface PersonFactory { 
    Person create(String firstName, String lastName); 
} 

private static void init(List<Person> persons, PersonFactory factory, String fn, String ln) { 
    persons.add(factory.create(fn, ln)); 
} 

} 

class Person { 
    private final String firstName; 
    private final String lastName; 

    public Person(String fName, String lName) { 
     this.firstName = fName; 
     this.lastName = lName; 
    } 

    public String getFirstName() {return this.firstName;} 
    public String getLastName() {return this.lastName;} 
} 

我想看看我是否能代替stream的「人」 List在一個走。

有什麼建議嗎?

+3

我不明白您用案件。如果你需要遍歷列表中的所有元素,只需使用'List.forEach',你甚至不需要流。當您需要過濾列表中的某些元素或對列表中的元素應用某種轉換時(即將名稱以「A」開頭的每個人轉換爲「Frog」),然後將它們收集到單獨的列表中。 –

回答

2

如果您不需要轉換對象到另一個,你可以試試這個

persons.forEach(i -> System.out.println(i.getFirstName() + " " + i.getLastName())); 
0

我認爲這可能是有益的,你使用地圖

Map<String, String> mapp = persons.stream().collect(HashMap::new, 
    (m, c) ->{ 
      m.put(c.getFirstname(), ""); 
      m.put(c.getLastname(), ""); 
    },HashMap::putAll); 

System.out.println(mapp.keySet().toString());