Wpis z mikrobloga

Hej,

Aplikacja Rest, java, spring.

Dostaje w headerze "Accept-Language" - na jego podstawie ustalam główny obsługiwany język naszej przeglądarki.
Potem wyciągam z bazy danych wszystkie języki obsługiwane przez moją aplikacje, mapuję na mój model restowy i chcę ustawić w mojej liście języków ustawić który element jest aktualnym językiem.

główna metodamapująca:

public static List mapFromSupportedLanguagesEntitiesAndSetActualLanguage(
List supportedLanguagesEntities, String actualLanguage) {
List supportedLanguagesList = new ArrayList<>();
for (SupportedLanguagesEntity supportedLanguagesEntity : supportedLanguagesEntities){
SupportedLanguages supportedLanguages = mapFromSupportedLanguagesEntity(supportedLanguagesEntity);
supportedLanguagesList.add(supportedLanguages);
}
setActualLanguage(supportedLanguagesList, actualLanguage);
return supportedLanguagesList;
}

metodaustawiająca flagę:

private static void setActualLanguage(List supportedLanguagesList, String actualLanguage) {
boolean actualLanguageExist = supportedLanguagesList.stream().anyMatch(s -> actualLanguage.equalsIgnoreCase(s.getIdentity()));
if (actualLanguageExist) {
for(SupportedLanguages supportedLanguages : supportedLanguagesList) {
if (actualLanguage.equalsIgnoreCase(supportedLanguages.getIdentity())) {
supportedLanguages.setActualLanguage(true);
}
}
} else {
for(SupportedLanguages supportedLanguages : supportedLanguagesList) {
if ("EN".equalsIgnoreCase(supportedLanguages.getIdentity())) {
supportedLanguages.setActualLanguage(true);
}
}
}
}

Pytanie jak ładniej napisać drugą metodę, nie podoba mi się że muszę trzykrotnie przelecieć po całej liście i interesuje mnie jakieś lepsze rozwiązanie(jesli jest).

PS. Jest dla javy jakis serwis gdzie mogę wrzucić kod który automatycznie sie tam sformatuje i nie trzeba go uruchamiać?

#java #naukaprogramowania
  • 10
@dinor913: Przekombinowałeś.

boolean actualLanguageExist = supportedLanguagesList.stream().anyMatch(s -> actualLanguage.equalsIgnoreCase(s.getIdentity()));
if (actualLanguageExist) {
for(SupportedLanguages supportedLanguages : supportedLanguagesList) {
if (actualLanguage.equalsIgnoreCase(supportedLanguages.getIdentity())) {
supportedLanguages.setActualLanguage(true);
}

Albo źle widzę klamry, albo całą tą metodę można zwinąć do:

https://gist.github.com/mtszpater/ee8981d3a59af604ca6b6c4f1b57818a

(nie patrz na nawiasy, bo moga byc #!$%@?)
@dinor913: przy wyciąganiu z bazy wrzuć do do mapy , i zrób:

SupportedLanguage actualLang = langMap.get(actualLanguage);

if (actualLang != null) {
actualLang.setActualLanguage(true);
} else {
langMap.get("en").setActualLanguage(true);
}
@fegwegw: nie podoba mi się to rozwiązanie
1.Muszę użyć pętli aby utworzyć mapy z odpowiednim kluczem.
2.Klucze muszą być odporne na wielkość liter więc musiał bym mieć w mapie mieć getIgnoreCase...
(można samemu stworzyć taką mapę)
@fegwegw:
1.Faktycznie mój błąd.
2.Uczono mnie że nie powinienem polegać na tym że obiekt zawsze będzie taki i taki i powinienem zapobiegać tego typu poprzez rożnego rodzaju walidacje - w tym przypadku ignoreCase.

Co sądzisz o tego typu zabezpieczeniach programu że np mamy w bazie danych wartości z małych liter i z hedera też dostajemy wartość z małych liter a i tak chcemy sie zabezpieczyć poprzez użycie ignoreCase.

nadgorliwość? czy może
@dinor913: z grubsza masz rację, jest wiele przypadków, w których powinno zależeć Ci na walidowaniu danych wejściowych.

Ale w tym przypadku zadałem pytanie - kto ustawia wartość headera? Tag language jest case-insensitive, więc jeśli to zawsze Ty (czy podmiot nad którym masz pełną kontrolę) ustawia ten tag, to możesz śmiało przyjąć, że np. zawsze będzie pisany wielkimi literami -> dzięki temu odpadnie Ci sprawdzanie, ot, jak ktoś wyśle małymi, to mu
@dinor913: ok, ale ten nagłówek coś ustawia. Jeśli to Twoja aplikacja, to możesz śmiało przyjąć, że będzie zawsze małymi/wielkimi literami (standard tego nie definiuje).