Mirasy, czegoś nie rozumiem w kwestii klasy Optional w Java 8. Stworzyłem klasę TestClass, która ma dwa pola: int x oraz String name i posiada konstruktor w którym inicjowane jest pole x. Pole name należy zainicjować na zewnątrz. I teraz dodaję sprawdzenie czy w pierwszej instancji jest ustawiony name, jeśli jest to chcę ustawić name w instancji tC2, ale nie chcę by to była ta sama wartość co w tC1, tylko "tC2". Wywołanie funkcji void nie jest możliwe, więc obszedłem to takim wyrazeniem lambda, ale czy nie da się tego zrobić prościej?
@krasnoludkolo: Może źle się wyraziłem. Samo w sobie jest super, ale ta składnia jest tragiczna. Zdecydowanie bardziej podoba mi się rozwiązanie z c# lub kotlina gdzie znakiem '?' ustalam czy może być null czy nie. Dla przykładu to co OP chce zrobić w Kotline wyglądałoby to tak: tc1.name?.let { tc2.name = "tC2" }
@krasnoludkolo: No nie, bo jakbyśmy chcieli tylko sprawdzić czy coś jest lub czegoś nie ma to byśmy zostali tylko przy tym x == null. Jak dla mnie to ma lepsze zastosowanie przy: String status = Optional.ofNullable(statusFromServer).orElseGet(() -> "UNKNOWN");
@kopytko1234: Zamiast String name powinieneś wewnątrz swojej klasy mieć Optional name, które zainicjujesz w konstruktorze na Optional.empty(). Uprości to trochę kod, który napisałeś.
Sugeruję również pójść o krok dalej i zastąpić setName przez withName, które zwróci niemutowalną kopię Twojego obiektu, tym razem z wypełnionym polem name (tj. Optional.of(name)). Pozwoli to na wyeliminowanie mutowalności z Twojej klasy, a więc całego szeregu różnych błędów, które pojawiłyby się w najmniej
if (a != null) { Obj b = a.getB(); if (b != null) { Obj c = b.getC(); if (c != null) { Obj d = c.getText(); if (d != null) { return d; } } } } return "another text"; czy
return Optional.ofNullable(a) .map(A::getB) .map(B::getC) .map(C::getText) .orElse("another text"); Ja wybieram opcję drugą ( ͡°͜ʖ͡°)
Mirki takie coś mi wyskoczyło na fejsie. Że niby to wodociąg, rura, która dostarcza się wodę pitną do domów. Jak myślicie, to nie fejk? #woda #chemia #ciekawostki #zywnosc #zywienie #zdrowie
Stworzyłem klasę TestClass, która ma dwa pola: int x oraz String name i posiada konstruktor w którym inicjowane jest pole x. Pole name należy zainicjować na zewnątrz.
I teraz dodaję sprawdzenie czy w pierwszej instancji jest ustawiony name, jeśli jest to chcę ustawić name w instancji tC2, ale nie chcę by to była ta sama wartość co w tC1, tylko "tC2".
Wywołanie funkcji void nie jest możliwe, więc obszedłem to takim wyrazeniem lambda, ale czy nie da się tego zrobić prościej?
TestClass tC1 = new TestClass( 1 );
tC1.setName( "tC1" );
TestClass tC2 = new TestClass( 2 );
Optional.ofNullable( tC1.getName() ).ifPresent( name -> tC2.setName( "tC2" ) ); // tC2.setName( "tC2" )
System.out.println( "tC1.name = " + tC1.getName() );
System.out.println( "tC2.name = " + tC2.getName() );
#pytanie #programowanie #java
Komentarz usunięty przez autora
@SuppressWarnings chcę to poznać by zrozumieć o co w tym chodzi ;)
Da się to zrobić bez tej bezsensownej lambdy?
Komentarz usunięty przez autora
Jednak Optionali w takiej formie bym nie używał. Optional służy bardziej do wstaw wartość X, jeżeli nie to Y.
Ja bym to zrobił tak:
Najprościej, nie ma co kombinować:
if (tc1.getName() == null) {
tC2.setName( "tC2" )
}
albo:
String nameForTestClass2 = tc1.getName() == null ? null : "tC2"
tC2.setName(nameForTestClass2)
tc1.name?.let { tc2.name = "tC2" }
Jak dla mnie to ma lepsze zastosowanie przy:
String status = Optional.ofNullable(statusFromServer).orElseGet(() -> "UNKNOWN");
String name
powinieneś wewnątrz swojej klasy miećOptional name
, które zainicjujesz w konstruktorze naOptional.empty()
. Uprości to trochę kod, który napisałeś.Sugeruję również pójść o krok dalej i zastąpić
setName
przezwithName
, które zwróci niemutowalną kopię Twojego obiektu, tym razem z wypełnionym polemname
(tj. Optional.of(name)). Pozwoli to na wyeliminowanie mutowalności z Twojej klasy, a więc całego szeregu różnych błędów, które pojawiłyby się w najmniej
if (a != null) {
Obj b = a.getB();
if (b != null) {
Obj c = b.getC();
if (c != null) {
Obj d = c.getText();
if (d != null) {
return d;
}
}
}
}
return "another text";
czy
return Optional.ofNullable(a)
.map(A::getB)
.map(B::getC)
.map(C::getText)
.orElse("another text");
Ja wybieram opcję drugą ( ͡° ͜ʖ ͡°)