2015-03-17 16 views
16

Dlaczego wydaje się, że nie ma metod na OptionalInt lub innych prymitywnych opcjonalnych smaków?Czy mogę nie mapować/wyodrębnić Mapę Opcjonalnie?

Operacje na mapach stream() umożliwiają konwersję między obiektami i elementami pierwotnymi. Ale dlaczego Optional nie wykorzystuje tego?

OptionalInt profileId = OptionalInt.of(124); 

Optional<Profile> profile = profileId.map(i -> getProfile(i)); //no such valid map() method! 
+0

Z jakiegoś powodu zdecydowali oni nie włączać tych operacji w prymitywne smaki Opcjonalnie. –

+0

Co jednak powstrzymałoby by wdrożenie metody, która konwertuje na OpcjonalnyInt na Opcjonalny? Strumień robi coś podobnego, jak sobie wyobrażam. – tmn

+0

Może to zostało pominięte, aby zachować lekkość, ponieważ to jest punkt prymitywów? Musi istnieć kilka wariantów metod map i map płaskich, aby uwzględnić inne prymitywne opcjonalne smaki, a także standardowy obiekt Opcjonalnie. – tmn

Odpowiedz

5

Prymitywne OPCJE nie mają mapę, flatMap i filtr metod, za pomocą wzoru. Ponadto, zgodnie z Java8 in Action p.305, nie należy ich używać. Uzasadnieniem użycia jako elementu pierwotnego w strumieniach są przyczyny związane z wydajnością. W przypadku dużej liczby elementów znaczny jest wzrost kosztów boksu/rozpakowywania. Jest to jednak bezsensowne, ponieważ w Opcjonalnym jest tylko jeden element.

Poza tym, należy rozważyć przykład:

public class Foo { 
    public Optional<Integer> someMethod() { 
     return Optional.of(42); 
    } 
} 

i użycie jako odniesienie metoda:

.stream() 
.map(Foo::someMethod) 

Jeśli zmienisz typ zwracanej metody someMethod do OptionalInt:

public OptionalInt someMethod() { 
    return OptionalInt.of(42); 
} 

Nie możesz użyj go jako odnośnika do metody, a kod nie będzie współdziałać mpile na:

.map(Foo::someMethod) 
+9

Nie widzę sensu twojego przykładu. z 'someMethod' zwracającym' OptionalInt', możesz go odwzorować, przekształci 'Stream ' w 'Stream ' (w przeciwieństwie do 'Stream >' w pierwszym przypadku). Argument wydajności też się nie sprawdza. Operacje na 'Stream' i' Opcjonalnym' dotyczą również kompozycji. Mogę 'stream.reduce (binOp).map (fun) 'na' Stream', ale nie mogę tego zrobić na 'IntStream'. Brak spójności jest denerwujący. Przynajmniej mógł istnieć "Opcjonalny w pudełku()", ponieważ jest on w "IntStream" ... – Xavier

2

Wydaje Java 9 OptionalInt będzie miał stream metodę, która daje IntStream z 0 lub 1 elementu w nim. W tym strumieniu możesz oczywiście użyć map(), flatMap() lub filter(), itp.

Dla Javy 8 nie mam nic do dodania do user2138356’s answer.

Powiązane problemy