Wpis z mikrobloga

cala idea streams polega na tym, ze definiujesz dzialanie a nie implementacje i rola Collectora jest wybranie najlepszego w danym momencie typu. Jak zrobisz stream parallel to juz wcale ArrayList taki dobry nie bedzie.


@M4ks: chyba nie rozumiem o co Ci tutaj chodzi. Jaki Ty widzisz związek pomiędzy stream, czy parallel stream i ArrayListą i czemu (o cokolwiek chodzi) miała by być kiedyś gorsza/lepsza? Przecież ArrayLista jest wyłącznie wykorzystywana w Collectorze
co konkretnie w mojej wypowiedzi odnosi się do tego błędu inżynierii oprogramowania? W sensie, że powinien nas interesować obiekt na którym pracujemy?


@Eoghan: to, ze nie bez powodu zwracany jest interface - a to oznacza, ze konkretna implementacja jest nieznana i nie nalezy na niej polegac.
Mozna sobie przekopiowac do czegos sie chce potem - ale konkretny typ zwracanego obiektu nie ma prawa cie interesowac poza interface, ktory implementuje. L w
@M4ks: ale to, że zwracany jest interface oznacza tylko tyle, że będziemy mieli w danej kolekcji metody z interfejsu. Nie oznacza to, że nie powinien nas interesować rzeczywisty typ obiektu - jeszcze raz w przypadku kolekcji znacząco może różnić się wydajność.
Odchodząc ciut od tego przykładu to że jakaś klasa implementuje jakiś interfejs nie oznacza też, że nie może ona definiować żadnych dodatkowych metod i zapis List lista = ... zamiast
Nie oznacza to, że nie powinien nas interesować rzeczywisty typ obiektu - jeszcze raz w przypadku kolekcji znacząco może różnić się wydajność.


@Eoghan: Owszem, oznacza to DOKLADNIE to.

jeszcze raz w przypadku kolekcji znacząco może różnić się wydajność.


@Eoghan: kolejny, co optymalizuje tam, gdzie nie trzeba. Jak potrzebny ci DOKLADNY typ, to uzywasz czegos, co zwraca DOKLADNIE ten typ - czyli np. konstruktora wskazanego typu.

to że jakaś klasa implementuje
Jak tylko kompilator przepusci ci taki zapis, to powodzenia ( ͡° ͜ʖ ͡°)


@M4ks: czemu miałby nie przepuścić (generyki pomijam, bo wykop wycina)?
@sorhu: odpowiedz prawidlowa, wkleilem linki do implementacji w openjdk. Jak mi pokaza implementacje Collectors.toSet() , z treeset to moga uwalac :D przypominam, ze nie rozmawiamy o tym ze nalezy "Program to an interface, not implementation."
czemu miałby nie przepuścić


@Eoghan: Czemu kompilator ma nie pozwolic ci przypisac obiektu typu List do zmiennej typu LinkedList? Nie mam zielonego pojecia, glupi kompilator... ( ͡° ͜ʖ ͡°)
@M4ks: A gdzie widzisz, że próbuję coś takiego zrobić, dwa zapisy, które podałem to:
List lista =
LinkedList lista =
(to co po prawej jest chyba oczywiste)
@afe1: Pokażą Ci javadoc, który mówi, że zwracany typ jest nieznany. Tyle wystarczy. ( ͡° ͜ʖ ͡°)

Teraz zwraca ArrayList, a w JDK 9 może będzie zwracało Stream.SuperDuperListImplementationOptimizedForStreamsImpl. I co zrobisz?

@grizzly_joe: Panie, to są programiści. Tu się o pierdoły najlepiej gryzie.

Trzeba było zapytać czy nawias klamrowy w nowej linii czy w tej samej.

Vim czy emacs.

Taby czy spacje.
@sorhu: az sprawdzilem: javadoc mowi o tym ze nei ma gwarancji co do typu zwracanego - tak jak pisalem - "There are no guarantees on the type" co nie oznacza ze implementacja jest nieznana. Jest znana bo sa zrodla openjdk. Po prostu nie nalezy zakladac implementacji, nalezy zalozyc ze toList() zwroci obiekt implementujacy interface Set.

@grizzly_joe: niech troche wzrosnie poziom mirko
@afe1: Oczywiście, że w źródłach znajdziesz odpowiedź, bo coś musi być zwracane. Ale, jak sam napisałeś, nie należy zakładać żadnego typu.
Wszystko się zgadza. :-D

@afe1: Wklejałem ci ten fragment nawet.... :D

nalezy zalozyc ze toList() zwroci obiekt implementujacy interface Set.

( ͡º ͜ʖ͡º) Tak wiem, drobna pomyłka.

Ah już @sorhu swoje edytował i dodał spoilera, ninja jeden :D