Wpis z mikrobloga

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?

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
  • 16
@kopytko1234: Racja. Nie zauważyłem, że setujesz do innej wartości.

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)
@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
@kopytko1234: @Patres: lol, niby dlaczego Optional to rak??

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ą ( ͡° ͜ʖ ͡°)