This statement sets one or more ToggleButton to selected if that ToggleButton's userData is found in the activeRoles list which is returned from the JavaFX ListProperty roles.getValue().
for( RoleDTO activeRole : roles.getValue() ) { for( Node availableRoleNode : hboxRoles.getChildren() ) { if( availableRoleNode.getUserData().equals( activeRole.getRoleId() ) ) { ( (ToggleButton) availableRoleNode ).setSelected( true ); break; } } }
This can be replaced with two Streams. The first Stream maps a List of Integer values that is used in the second Stream's filter predicate.
List<Integer> activeRoleIds = roles.getValue() .stream() .map( (r) -> r.getRoleId() ) .collect(Collectors.toList()); hboxRoles.getChildren() .stream() .filter( (n) -> activeRoleIds.contains(n.getUserData()) ) .forEach( (n) -> ((ToggleButton)n).setSelected(true) );
Both the nested loops and the pair of Streams will set the appropriate ToggleButton state. The Streams versions will offer a savings if later blocks of code also can use the activeRoleIds List.
Update
Here's another example of a loop (not a nested loop) rewritten as a Lambda.hboxRoles.getChildren().clear(); for( RoleDTO role : availableRoles ) { ToggleButton tb = new ToggleButton( role.getRoleName() ); tb.setUserData( role.getRoleId() ); hboxRoles.getChildren().add( tb ); }
The Lambda uses the map() method to convert transfer objects (RoleDTO) into JavaFX controls (ToggleButton).
hboxRoles.getChildren().setAll( availableRoles .stream() .map( (r) ->l; { ToggleButton tb = new ToggleButton(r.getRoleName()); tb.setUserData( r.getRoleId() ); return tb; }) .collect(Collectors.toList()) );
No comments:
Post a Comment