2016-03-24 6 views
-1

Ich habe den folgenden Code:Chaining Lambda-Anrufe mit Strom und optional

userService.getUserWithAuthorityByLogin(principal.getName()) 
       .map(user->userRepository.findAllByClient(user.getClient().getId())); 

Verfahren findAllByClient zurückgeben List<User> Typ. Die Kartenmethode gibt eine Optional<Object> In meinem Fall könnte es (optional) eine Optional<List<User>> zurückgeben. Die Idee, die ich kodieren möchte, besteht darin, einen Stream für diese optionale Liste zu verwenden. Ich möchte meine Anrufe verketten. Code in Java 8 Stil ist gut aussehend und weniger Zeilen Code.

Ich muss diese List<User> verarbeiten, wenn es wirklich existiert (vorhanden). Wie kann ich meine Anrufe mit java8 api verketten: Ich möchte optional und Stream mischen.

Danke.

EDIT:

ich weiterhin ein bisschen weiter:

userService.getUserWithAuthorityByLogin(principal.getName()) 
.map(user->userRepository.findAllByClient(user.getClient().getId()).stream().forEach(user-> 
{ 
    managedUserDTOs.add(new ManagedUserDTO(user)); 

})); 

Sie den gesamten Prozess haben. Aber das kompiliert nicht auf Anweisung

managedUserDTOs.add(new ManagedUserDTO(user)) 

Ich möchte die Liste füllen und es am Ende zurückgeben.

EDIT2:

Die gesamte Wickelmethode:

/** 
    * GET /users -> get all users. 
    */ 
    @RequestMapping(value = "/user-liste", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
    @Timed 
    @Transactional(readOnly = true) 
    @Secured({AuthoritiesConstants.TC_ADMIN}) 
    public ResponseEntity<List<ManagedUserDTO>> getUserListe(Principal principal) 
     throws URISyntaxException { 

     return new ResponseEntity<>(managedUserDTOs, HttpStatus.OK); 
    } 
+0

nicht sicher, ob ich die Idee Ihrer Frage kam, aber.. 'userService.getUserWithAuthorityByLogin (principal.getName()) .flatMap (user-> userRepository.findAllByClient (user.getClient() getId()) Strom()) foreach (); ' – Aliaxander

+0

ok Ich bearbeite den Originalbeitrag –

+0

@FrancoisF Ich glaube, du suchst nach 'userService.getUserWithAuthorityByLogin (principal.getName()) .map (user-> userRepository .findAllByClient (user.getClient(). getId()). stream()) .map (benutzer-> VerwaltetesUserDTO :: neu) .collect (Collectors.toList()) ' –

Antwort

0

Können Sie versuchen:

userService.getUserWithAuthorityByLogin(principal.getName()).map(user->userRepository.findAllByClient(user.getClient().getId()).stream().map(ManagedUserDTO::new).collect(Collectors.toList())).get(); 

Gleiche wie die in den Kommentaren, aber ich denke, dass einige Codierung Probleme hat. Ich sehe ?, wenn ich es kopiere/einfüge. Dies sollte helfen.

+0

Es funktioniert! Das ist ziemlich eleganter Code! Vielen Dank für Deine Mühe. Du gewinnst die Medaille :) –

+0

@ FrançoisF. Ich bin froh, dass es geholfen hat, da es mein erster Post von Lambdas ist, glaube ich. –

0

Hier die Antwort aber nicht in JAVA8. Ich möchte die Java8 Antwort:

/** 
    * GET /users -> get all users. 
    */ 
    @RequestMapping(value = "/user-liste", 
     method = RequestMethod.GET, 
     produces = MediaType.APPLICATION_JSON_VALUE) 
    @Timed 
    @Transactional(readOnly = true) 
    @Secured({AuthoritiesConstants.TC_ADMIN}) 
    public ResponseEntity<List<ManagedUserDTO>> getUserListe(Principal principal) 
     throws URISyntaxException { 


     Optional<User> ouser = userService.getUserWithAuthorityByLogin(principal.getName()); 
     List<ManagedUserDTO> managedUserDTOs = new ArrayList<>(); 
     if (ouser.isPresent()) 
     { 
      List<User> userListe = userRepository.findAllByClient(ouser.get().getClient().getId()); 
      for (User user : userListe) 
      { 
       managedUserDTOs.add(new ManagedUserDTO(user)); 
      } 
     } 

     return new ResponseEntity<>(managedUserDTOs, HttpStatus.OK); 

    }