Guava Iterables vs Collections2

Guava Iterables vs Collections2
KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0

Porównajmy Iterables.filter(...) i Collections2.filter(...) oba robią dokładnie to samo. Ktoś mi rozjaśni jaka jest różnica i kiedy który stosować? A jak nie ma różnicy, to po co są dwa sposoby?

jarekr000000
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 5 godzin
  • Lokalizacja:U krasnoludów - pod górą
  • Postów:4707
0

Guava....


jeden i pół terabajta powinno wystarczyć każdemu
edytowany 1x, ostatnio: jarekr000000
KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0
jarekr000000 napisał(a):

Guava....

I co ta odpowiedź wnosi do tematu? Jak chcesz zabłysnąć, to podaj mi alternatywę na Androida starszego niż 7 (nie, Kotlin to nie odpowiedź)

edytowany 1x, ostatnio: kulson
jarekczek
Wnosi fajny klimat. Apropos, nie cytuj takich wielgachnych kawałków, bo to już zupełnie nic nie wnosi :)
KR
  • Rejestracja:ponad 8 lat
  • Ostatnio:około 7 godzin
  • Postów:166
0

Na pierwszy rzut oka to jedna operuje na Iterable a druga na Collection. Są to dwa różne interfejsy, nie każde Iterable jest Collection.
Jak ogólnie ktoś pracuje na kolekcjach to pewnie niewygodne byłoby używanie Iterable i rzutowanie z powrotem na Collection.

KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0

Jak się zdaje, znalazłem różnicę. Wygląda na to, że Iterables filtruje i zwraca wynik, to tyle. Jeśli chodzi o Collections2, to:

A few things to note here – first, the output of Collections.filter() is a live view of the original collection – changes to one will be reflected in the other.

It’s also important to understand that now, the result is constrained by the predicate – if we add an element that doesn’t satisfy that Predicate, an IllegalArgumentException will be thrown:

Kopiuj
@Test(expected = IllegalArgumentException.class)
public void givenFilteredCollection_whenAddingInvalidElement_thenException() {
    List<String> names = Lists.newArrayList("John", "Jane", "Adam", "Tom");
    Collection<String> result 
      = Collections2.filter(names, Predicates.containsPattern("a"));
 
    result.add("elvis");
}

P.S. przekonwertować do normalnej listy/mapy/set czy coś tam można tak samo w obu przypadkach, to nie ma znaczenia.

edytowany 3x, ostatnio: kulson
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
0

Barbara Liskov gdzieś po drodze się rozpłakała, trafiając na Collection2.filter().

A co do alternatyw dla Guavy wolałbym skorzystać w kolejności z:

  • Kotlin
  • Scala
  • Bazel + Desugar + Streamy
  • poczekać na Streamy z Desugar w AGP
  • jakiś backport Stream API
edytowany 4x, ostatnio: Michał Sikora
KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0

Naprawdę wolisz jakiś niesprawdzony backport stream api? Każdy, który znam nie nadaje się do niczego. Jaki konkretnie masz zarzut do Guavy? Coś tam działa nie tak jak powinno? Gdzieś wycieki pamięci, namacalne spadki wydajności? Generuje jakiś wielki narzut?

Takie gadanie, że nie bo nie to nie wynika z żadnych obiektywnych przesłanek, tak samo jak ciągle odradzasz gsona, z tą różnicą że gson ma alternatywy, a guava collections albo FluentIterable nie ma (zmiana języka na inny to nie alternatywa).

Tak btw stream api raczej nigdy nie będzie kompatybilne z Androidem < 7, więc poczekać to można, ale na czas, gdyby Androida starszego niż 7 będzie można olać.

Gdyby nie chodziło o Androida, to faktycznie wystarczy Java8, ale wolę Guav niż jakiś krzywy port stream api.

edytowany 2x, ostatnio: kulson
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
1
kulson napisał(a):

Naprawdę wolisz jakiś niesprawdzony backport stream api? Każdy, który znam nie nadaje się do niczego.

Nie, nie wolę niesprawdzonych backportów. Dlatego nigdzie nie podałem, żeby korzystać z niesprawdzonego backportu Streamów. Co więcej, działający backport Stream API wymieniłem jako ostatnią z alternatyw.

kulson napisał(a):

Jaki konkretnie masz zarzut do Guavy? Coś tam działa nie tak jak powinno? Gdzieś wycieki pamięci, namacalne spadki wydajności? Generuje jakiś wielki narzut?

Jakiś konkretny zarzut do Guavy? Nie wiem. Niespecjalnie prawdę powiedzawszy. Po prostu widzę rozsądniejsze rozwiązania. Nigdzie nie pisałem, żeby nie korzystać z Guavy, czy że jest zła. Aczkolwiek nie podoba mi się w Guavie kilka rzeczy. Chociażby ten potworek, którego wkleiłeś we wcześniejszym poście. Albo 15k metod na twarz w wersji light, które mogłyby być spokojnie podzielone na mniejsze artefakty.

kulson napisał(a):

Takie gadanie, że nie bo nie to nie wynika z żadnych obiektywnych przesłanek, tak samo jak ciągle odradzasz gsona, z tą różnicą że gson ma alternatywy, a guava collections albo FluentIterable nie ma.

Nie wiem, co GSON ma wspólnego z tematem. Ogłaszanie, że ktoś nie podaje argumentów nie oznacza od razu, że ta osoba ich nie podaje. Już kilka razy odnosiłem się do jego popsutego API. Po prostu wolę spacer po lesie zamiast po polu minowym. Natomiast jeżeli komuś wygodnie z GSON'em, to niech z niego korzysta.

kulson napisał(a):

(zmiana języka na inny to nie alternatywa)

Niechęć do używania czegoś, nie sprawia, że to nie jest alternatywą.

Tak btw stream api raczej nigdy nie będzie kompatybilne z Androidem < 7, więc poczekać to można, ale na czas, gdyby Androida starszego niż 7 będzie można olać.

Zdefiniuj kompatybilne. Jeżeli uważasz, że np. lambdy albo domyślne metody w interfejsach są niekompatybilne, to się nawet zgodzę. Jeżeli nie, to podałem w poprzednim poście, jak korzystać z Javowych Streamów.

edytowany 1x, ostatnio: Michał Sikora
KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0
Michał Sikora napisał(a):
kulson napisał(a):

Jeżeli nie, to podałem w poprzednim poście, jak korzystać z Javowych Streamów

Sprecyzujesz? Bazel? Jak to działa? Domyślnie streamów jak wiadomo, nie da się użyć na Androidzie starszym niż 7. Lambdy akurat są kompatybilne, więc nie wiem co masz na myśli.

A Guava/Iterable/FluentIterable to praktycznie ta sama składnia, co streamy. Po co te parcie na streamy w zasadzie?

edytowany 2x, ostatnio: kulson
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

To w takim razie jeśli jest lambda to VAVR powinien tez przechodzić choć na Androida to może być overkill


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0

No nie bardzo: https://github.com/vavr-io/vavr/issues/985 ale jakby nawet, to byłyby pewnie te same ograniczenia, co streamy

edytowany 1x, ostatnio: kulson
S9
  • Rejestracja:ponad 10 lat
  • Ostatnio:5 miesięcy
  • Lokalizacja:Warszawa
  • Postów:3573
0

A racja, przecież Vavr wymaga 8...


"w haśle <młody dynamiczny zespół> nie chodzi o to ile masz lat tylko jak często zmienia się skład"
Michał Sikora
Michał Sikora
  • Rejestracja:około 7 lat
  • Ostatnio:prawie 4 lata
  • Lokalizacja:Kraków
  • Postów:834
0
kulson napisał(a):

Sprecyzujesz? Bazel? Jak to działa? Domyślnie streamów jak wiadomo, nie da się użyć na Androidzie starszym niż 7. Lambdy akurat są kompatybilne, więc nie wiem co masz na myśli.

Mmmm... Trochę od końca zacznę. To akurat lambdy są przede wszystkim niekompatybilne z Androidem na poziomie kodu binarnego. To jest dokładnie powód, dla którego np. Vavr nie działałby na Androidzie. Do specyfikacji Dalvika odpowiednik invokedynamic w postacji invoke-custom został dodany dopiero w wersji 38. Niemniej, dalej nie ma konkretnej implementacji LambdaMetafactory, która pozwalałaby na generowanie lambd podczas działania programu. Możliwość korzystania z wyrażeń lambda wynika z jakieś procesu postkompilacyjnego. Może to być np. Retrolambda, Jack & Jill albo Desugar. Desugar jest to narzędzie wyciągnięte z Bazel i dodane do AGP. Transformuje ono kod źródłowy zawierający np. lambdy na taki, który jest kompatybilny z DEX.

Streamy, same w sobie, nie posiadają akurat niczego specjalnego po stronie kodu binarnego (pomijając, że są napisane na lambdach). Natomiast napisanie programu, który by transformował odpowiednio całe API jest dużo trudniejsze i bardziej pracochłonne niż transformacja lambd. Desugar został wzbogacony m.in. o Streamy jakoś w lutym, ale tylko wewnątrz projektu Bazel i trzeba poczekać na przeportowanie go do AGP. Natomiast Bazel sam w sobie nic nie robi specjalnego. System budowy projektów "jak każdy inny".

kulson napisał(a):

A Guava/Iterable/FluentIterable to praktycznie ta sama składnia, co streamy. Po co te parcie na streamy w zasadzie?

Ależ ja się zgadzam. Ja nie mam żadnego parcia na Streamy. Jak ktoś już ma Guavę w projekcie, to niech korzysta z Guavy. Równie dobrze nie miałbym nic przeciwko używaniu synchronicznie Rx API do takich transformacji, jeżeli już byłby Rx w projekcie. Wyglądałoby to trochę głupio, ale zasadniczo działałoby dobrze. Czemu wolałbym inne rozwiązania niż Guava, po krótce napisałem wcześniej.

KU
  • Rejestracja:około 7 lat
  • Ostatnio:ponad 6 lat
  • Postów:369
0
Michał Sikora napisał(a):

Desugar został wzbogacony m.in. o Streamy jakoś w lutym, ale tylko wewnątrz projektu Bazel i trzeba poczekać na przeportowanie go do AGP.

Ze streamów można korzystać od dawna, ale tylko jeśli minimalne api to Nougat. Chodzi ci o to, że Desguar z Bazel nie ma tego ograniczenia i można korzystać też na starszych Androidach?

Michał Sikora
Michał Sikora
Tak. Podobnie jak z innych API z Javy 8.
KU
Czekamy więc
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)