2016-08-26 4 views
0

私はモデルクラスを持っている:私はモデルクラスからpersonnelIdを取得List<String>List<Person>を変換する際にJavaモデルオブジェクトをStringオブジェクトから戻す方法は?

public class Person{ 
    private String personnelId; 
    private String lastName; 
    private String firstName; 
} 

は、今私は、サービスクラス今

public class A{ 
    @Autowired 
    private OfficerService officer; 

    public List<Person> getAccounts(Param param){ 
     List<Person> personList = personDao.getAccounts(param); 
     List<String> stringList = personList.stream().map(Person::getPersonnelId).collect(Collectors.toList()); 
     List<String> list = Officer.getVisiblePerson(stringList); 
     List<Person> visiblePersonList= new ArrayList<>(); 

     return visiblePersonList; 
    } 

を持っています。メソッドコールの後、私はpersonnelIdに戻ります。 List<Person>に変換する必要があります。このデータには、firstNamelastNamePersonクラスのすべてのデータが含まれています。どうやってやるの?

EDIT:

Map<String, Person> personMap = personList.stream() 
     .collect(Collectors.toMap(Person::getPersonnelId, person -> person)); 
    List<Person> visiblePersonList = list.stream() 
     .map(id -> personMap.get(id)) 
     .collect(Collectors.toList()); 

私はマップの収集にエラーが発生します。

The method collect(Collector<? super String,A,R>) in the type Stream<String> is not applicable for the arguments (Collector<Person,capture#2-of ?,Map<String,Object>>) 

は私が間違って何をしているのですか?

+0

'List 'への変換は本当に必要ですか? –

+3

モデルとして使いたいのであれば、なぜそれを文字列に変換しましたか? – EJP

+0

ええ、私はいくつかの第三者サービスを消費し、そのサービスは文字列を取るだけです。 – sleepysiliconvalley

答えて

2

地図に表示され、マップからこれらの値を取得する1つの方法です。追加の反復が1回ありますが、リストの大きさに応じて、またはパラレルにすることができるかどうかに応じて、パフォーマンスは多少低下します。

public static void main(String[] args) throws Exception { 
    List<Person> personList = new ArrayList<Person>(); // personDao.getAccounts(param); 

    Person person1 = new Person("1", "ln1", "fn1"); 
    Person person2 = new Person("2", "ln2", "fn2"); 
    Person person3 = new Person("3", "ln3", "fn3"); 
    Person person4 = new Person("4", "ln4", "fn4"); 
    personList.add(person1); 
    personList.add(person2); 
    personList.add(person3); 
    personList.add(person4); 

/*Of interest , the logic*/ 
     List<String> stringList = personList.stream().map(Person::getPersonnelId).collect(Collectors.toList()); 
     Map<String, Person> mapStringToPerson = personList.stream() 
       .collect(Collectors.toMap(Person::getPersonnelId, person -> person)); 

/*as a logic filter even number id , in a real life this will be officer filter*/ 
      List<String> listFiltered = stringList.stream().filter(personId -> (Integer.parseInt(personId) % 2 == 0)) 
        .collect(Collectors.toList());// Officer.getVisiblePerson(stringList); 
      List<Person> visiblePersonList = listFiltered.stream().filter(id -> mapStringToPerson.containsKey(id)) 
        .map(id -> mapStringToPerson.get(id)).collect(Collectors.toList()); 
      visiblePersonList.forEach(System.out::println); 

} 

プリント::

Person with id : 2 and name fn2 ln2 
    Person with id : 4 and name fn4 ln4 
1

まず、私はいくつかの命名の問題に対処しましょう:

  • Officerofficerでなければなりません。

  • stringListの名前はidListである必要があります。概念的にはこれが含まれているためです。あなたが...を見て、(あなたがそれを推測)ことがわかります

    1. ...タイプ:ので、あなたは、タイプのためにそれを名前を付けないでください。
    2. 「文字列」と言っても意味がなく、文字列の意味については何も言わない。
  • 同様に、listvisibleIdListとする必要があります。

ここで私が提案した名前を使用します。 getVisiblePerson()以来

、すなわちフィルタリングされたリストは、次の2つの事柄のいずれかを行うことができ、表示されているidListからのエントリのリストを返します。

  1. visibleIdListとルックアップを繰り返す、その後、PersonidMap<String, Person>を作成します。 Personとそのリストを作成します。

  2. visibleIdListvisibleIdSetに変換し、次にpersonListを反復し、Setのものにフィルタリングします。

オプション2はメモリフットプリントが小さく、パフォーマンスも向上します。

関連する問題