Преобразование списка объектов в список строк

#string #list #listview #javafx #spring-data-jpa

Вопрос:

Я использую метод Spring data jpa findAll() . Таким образом, он возвращает список объектов. вот сущность.

 @Entity @Table(name = "country") @Data public class CountryEntity {  @Id  @GeneratedValue(strategy = GenerationType.AUTO)  @Column(name = "country_id")  private Long id;  @Column(name = "country_name")  private String name;  @OneToMany(mappedBy ="countryEntity")  private Collectionlt;GovernmentEntitygt; governments; }  

и findAll() метод jpa данных является

 Listlt;CountryEntitygt; entities = countryRepo.findAll();  

Я хочу получить список названий стран в виде строки БЕЗ ИСПОЛЬЗОВАНИЯ циклов или потоков (проблемы с производительностью).

Я использовал потоки, и это отлично работает с JavaFX ListView

 @FxmlView("/address.fxml") @Component @RequiredArgsConstructor public class HomeController implements Initializable {  private ObservableListlt;Stringgt; countriesNames;  @FXML  private ListViewlt;Stringgt; countryListView;   @Override  public void initialize(URL url, ResourceBundle resourceBundle) {  Listlt;CountryEntitygt; entities = countryRepo.findAll();  List lt;Stringgt; countryList = entities.stream().map(o-gt; Objects.toString(o.getName())).collect(Collectors.toList());  countriesNames = FXCollections.observableList(countryList);  countryListView.getItems().addAll(countriesNames); } }  

Комментарии:

1. проработайте учебник о том, как использовать ListView, в частности о том, как настроить визуальное представление его элементов

2. конечно, я буду благодарна клеопатре

Ответ №1:

Сделайте свой ListView a ListViewlt;CountryEntitygt; и используйте фабрику ячеек для настройки дисплея:

 public class HomeController implements Initializable {   private ObservableListlt;Stringgt; countriesNames;  @FXML  private ListViewlt;CountryEntitygt; countryListView;   @Override  public void initialize(URL url, ResourceBundle resourceBundle) {  Listlt;CountryEntitygt; entities = countryRepo.findAll();  countryListView.getItems().addAll(entities);  countryListView.setCellFactory(lv -gt; new ListCelllt;CountryEntitygt;() {  @Override  protected void updateItem(CountryEntity country, boolean empty) {  super.updateItem(country, empty);  if (empty || country == null) {  setText("");  } else {  setText(country.getName()); // or however you want to display it  }  });   } }  

Если вам действительно нужен только список названий стран, и вы не хотите получать список стран CountryEntity и извлекать из них имена, вам необходимо определить метод в своем репозитории для этой цели:

 public interface CountryEntityRepository extends JpaRepositorylt;CountryEntity, Longgt; {   // existing methods...   @Query("select c.name from CountryEntity c")  Listlt;Stringgt; findCountryNames() ;  }  

А потом, конечно, просто сделай

 @FXML private ListViewlt;Stringgt; countryListView ;  @Override public void initialize(URL url, ResourceBundle resourceBundle) {  countryListView.getItems().addAll(countryRepo.findCountryNames()); }  

Однако первый подход почти наверняка предпочтительнее. Вероятно, в какой-то момент вам понадобятся другие данные CountryEntity .

Комментарии:

1. большое спасибо, ты герой