Hirdetés

2024. május 30., csütörtök

Gyorskeresés

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Java programozás (kiemelt téma)

Hozzászólások

(#11901) Ablakos válasza Lortech (#11900) üzenetére


Ablakos
őstag

Világos, köszönöm.

(#11902) sztanozs válasza btraven (#11898) üzenetére


sztanozs
veterán

Szerintem ne menj

JOGI NYILATKOZAT: A bejegyzéseim és hozzászólásaim a személyes véleményemet tükrözik; ezek nem tekinthetők a munkáltatóm hivatalos állásfoglalásának...

(#11903) Ablakos


Ablakos
őstag

Egy kis stream alap...

A végrehajtásban a .map upperCase -ként fűzi, adja tovább a stream elemet. Ez eddig érthető(számomra). Az .anyMatch -nél nem értem, hogy a kiértékelt boolean eredmény mit jelent. A következő stream ciklusban megint az eredeti következő stream elem lesz manipulálva.
Hogy is van ez?

    Stream.of("d2", "a2", "b1", "b3", "c")
        .map(s -> {
            System.out.println("map: " + s);
            return s.toUpperCase();
        })
        .anyMatch(s -> {
            System.out.println("anyMatch: " + s);
            return s.startsWith("A");
        });
    // map:      d2
    // anyMatch: D2
    // map:      a2
    // anyMatch: A2    

(#11904) Drizzt válasza Ablakos (#11903) üzenetére


Drizzt
nagyúr

anyMatch egy Predicate-et vár. A Predicate egy olyan függvény, ami valamilyen bemenetre egy booleanüt ad vissza.
Az anyMatch addig folytatja a kiértékelést, amíg a predicate igaz nem lesz. Tehát jelen esetben addig, amíg nem talál olyan elemet, ami nagy A-val kezdődik. Utána leáll a további feldolgozás, mert teljesen felesleges lenne.

I am having fun staying poor.

(#11905) Sirpi válasza Ablakos (#11903) üzenetére


Sirpi
senior tag

A stream-et egy iterátorként fogd fel, és a benne lévő lépések végrehajtódnak minden elemre.
Tehát minden elemre végre fog hajtódni először az upperCase, ami nagybetűsít. Ennek az eredménye megy át elemenként az anyMatch-be, ami megnézi, hogy az adott elem A betűvel kezdődik-e. Az anyMatch egy terminal operátor, vagyis zárja a stream-et, további lépést nem tudsz hozzáfűzni. A visszatérési értéke boolean:

boolean anyMatch(Predicate<? super T> predicate)

Tehát az egész stream kiértékelés eredménye egy true/false érték, és true akkor, ha valamelyik elem nagybetűsítve A-val kezdődik. Az első sor elejére ezt is írhatod:

boolean existsWithA = Stream.of("d2", "a2", "b1", "b3", "c")...

És jelen esetben ez true-t fog visszaadni, de ha az a2-t kiszeded, akkor false-t.

Hazudnék, ha cáfolnám annak tagadását, hogy ez az ital nem nélkülözi a koffeinmentesség megnemlétének hiányát. Na most akkor van benne koffein, vagy nincs?!

(#11906) Ablakos


Ablakos
őstag

Köszönöm mindenkinek. Teljesen fordítva gondoltam az .anyMatch kiértékelést. Addig megy amíg igaz nem lesz a kiértékelése :B

[ Szerkesztve ]

(#11907) hiperFizikus válasza btraven (#11898) üzenetére


hiperFizikus
aktív tag

Ha keresed a bajt magadnak ...
nő vagy ?
:Y

A gázt is és a féket is egyszerre nyomni nem menő dolog !

(#11908) Ablakos


Ablakos
őstag

Megismerkedtem a "stream" technikával. Nagyon tetszik tizen- sorok helyett egy utasításba lefűzni a kódot.
A kérdésem, hogy ez a tömörség csak a forráskódot érinti, vagy a lefordult
bájtkód/végrehajtási sebességet is gyorsítja?
(Biztos össze lehet hasonlítani méréssel, de nem akarom feltalálni a kereket. :N )

(#11909) Sirpi válasza Ablakos (#11908) üzenetére


Sirpi
senior tag

Alapból a stream-nek van minimális overhead-je a hagyományos bejárással szemben, viszont sokkal jobban karbantartható kódot eredményez.
Másrészt ha nagyon heavy a stream kiértékelése (pl. sokmilliós rekordszám), akkor a .parallel() lépést beiktatva a stream-be párhuzamosítja a feldolgozást, és magszám-közeli szorzót lehet így elérni sebességben.

Hazudnék, ha cáfolnám annak tagadását, hogy ez az ital nem nélkülözi a koffeinmentesség megnemlétének hiányát. Na most akkor van benne koffein, vagy nincs?!

(#11910) Ablakos


Ablakos
őstag

Elakadtam a következő stream soron:
 ArrayList<Literacy> list = new ArrayList<>();
        try {
            Scanner scanner = new Scanner(Paths.get("literacy.csv"));
            while (scanner.hasNextLine()) {
                String[] line = scanner.nextLine().trim().split(",");
                list.add(new Literacy(line[0],line[1],line[2],line[3],Integer.valueOf(line[4]),Double.valueOf(line[5])));
                
            }
        } catch (IOException ex) {
            System.out.println(ex);
        }
        list.stream()
            .sorted((p1, p2) -> {return p1.getLiteracyRate() - p2.getLiteracyRate();})
            .forEach(l -> System.out.println(l));
A fordítási hibaüzenet: incompatible types: bad return type in lambda expression
possible lossy conversion from double to int
A Literacy osztályban a getLiteracyRate double típus.

Nem értem mi a baja két double kivonásával és visszaadásával? (int-el működne, de nem az a feladat)

(#11911) BE4GLE válasza Ablakos (#11910) üzenetére


BE4GLE
aktív tag

p1.getLiteracyRate() - p2.getLiteracyRate()
Ehelyett írd ezt: Double.compare(p1, p2)

Redmi Note 9 Pro

(#11912) BE4GLE válasza Ablakos (#11910) üzenetére


BE4GLE
aktív tag

Egy kis magyarázat: A comparator mindig int visszatérési értékű. Az érték előjele mutatja meg, hogy merre néz a kacsacsőr. Ha nem primívet használsz, akkor az object rendelkezik egy compareTo metódussal aminek int a visszatérési értéke. Szóval ha double helyett Double lenne a property, akkor hívhatnád így is. p1.compareTo(p2). Vagy ha ez az egyetlen property akkor akár comparator nélkül is mehet: sorted()

Redmi Note 9 Pro

(#11913) floatr válasza BE4GLE (#11911) üzenetére


floatr
veterán

törölve

[ Szerkesztve ]

(#11914) Ablakos válasza BE4GLE (#11911) üzenetére


Ablakos
őstag

 .sorted((p1, p2) -> {return Double.compare(p1.getLiteracyRate(), p2.getLiteracyRate());})
Így már működik! Megjegyeztem. Köszönöm!

(#11915) BE4GLE válasza Ablakos (#11914) üzenetére


BE4GLE
aktív tag

Hopsz! Igen, azt nem írtam ki szépen. De látom ügyesen megoldottad. :R Szívesen!

[ Szerkesztve ]

Redmi Note 9 Pro

(#11916) floatr válasza Ablakos (#11914) üzenetére


floatr
veterán

Metódus-referenciát akartam írni, de elbabráltam.
Ha a Literacy osztályban implementálsz egy static compare metódust a Double::compare mintájára (ahogy a lambdában csináltad), akkor úgy is lehetne a streames kód, hogy:
.sorted(Literacy::compare)

Rövidebb nem lesz összességében, de elegánsabb, és nálam egy kód reviewn is hamarabb átmegy ;)

[ Szerkesztve ]

(#11917) BE4GLE válasza floatr (#11916) üzenetére


BE4GLE
aktív tag

Hát igazából, ha már ott implementálja, akkor simán override-olhatja a compareTo metódust, és akkor üresen is hívhatja a sorted() függvényt. :B

Redmi Note 9 Pro

(#11918) floatr válasza BE4GLE (#11917) üzenetére


floatr
veterán

Mindig tanul az ember valamit :)

(#11919) yossarian14 válasza Ablakos (#11910) üzenetére


yossarian14
tag

Egy másik megoldás még ide, amit gyakran szoktak alkalmazni:
.sorted(Comparator.comparingDouble(Literacy::getLiteracyRate))

(#11920) floatr válasza yossarian14 (#11919) üzenetére


floatr
veterán

Igaz. Ezeket mindig elfelejtem, pedig nem hülyeség

(#11921) Szmeby


Szmeby
tag

Még egy kis kiegészítés a comparator implementációhoz. :D
Ha nagyon nagy számokkal dolozunk, akkor nem szerencsés a kivonásos módszer használata, pl. a p1.getLiteracyRate() - p2.getLiteracyRate(). Ugyanis ha egy nagyon negatív számból kivonunk egy nagyon pozitív számot, akkor az eredmény túlcsordulhat és átcsap az ellenkező előjelbe, ami nyilván elrontja az egész sorrendezést.
Érdemes inkább a relációs operátorokat (<, >) használni a kivonás helyett.

(#11922) Ablakos válasza Szmeby (#11921) üzenetére


Ablakos
őstag

(Most nincs lehőségem kipróbálni, ezért kérdezek. :B )

Ebben az esetben az intermediate egy int eredményt vár, hogy sortolja a stream-et. A kacsacsőr boolean-t ad vissza. Vagy ezt az igaz/hamis értéket még vizsgálni kell operátorral? Így kell érteni?

(#11923) Szmeby válasza Ablakos (#11922) üzenetére


Szmeby
tag

A boolean-ből könnyen csinálhatsz 0, 1, -1 értékeket. Puskázva az Integerből :):

public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}

[ Szerkesztve ]

(#11924) Ablakos


Ablakos
őstag

Volt már hasonló kérdésem saját osztállyal. (ősosztály metódus elérés, override)

Azt még mindig nem értem, hogy beépített osztályoknál mi a különbség a list1-list2 között, ha az egyiket List-be a másikat ArrayList típusba teszem. (ez a kérdés akár a Map/HahMap -re vonatkozhatna)

List<String> list1 = new ArrayList<String>();
ArrayList<String> list2 = new ArrayList<String>();

(#11925) floatr válasza Ablakos (#11924) üzenetére


floatr
veterán

A list1 List típusú a fordító és a runtime számára, aminek nincsenek olyan metódusai, amiket a list2-ben megtalálsz. Pl. a java 8 szerint a forEach.

(#11926) Sirpi válasza floatr (#11925) üzenetére


Sirpi
senior tag

És amennyiben nincs is szükséged, hogy elérd ezeket a metódusokat, mindig az interface-t használd típusnak, ne a konkrét megvalósítást, mert így bármikor ki tudod cserélni a tényleges típust (pl. LinkedList-re) anélkül, hogy a kódod egyéb részeihez hozzá kellene nyúlnod.

Hazudnék, ha cáfolnám annak tagadását, hogy ez az ital nem nélkülözi a koffeinmentesség megnemlétének hiányát. Na most akkor van benne koffein, vagy nincs?!

(#11927) yossarian14 válasza floatr (#11925) üzenetére


yossarian14
tag

A List interface-ben van forEach, nem?

(#11928) BE4GLE válasza Ablakos (#11924) üzenetére


BE4GLE
aktív tag

Annyit tennék, még hozzá, hogy az ArrayList mutable. A projektekben az ilyen típusú visszatérési értékek kerülendők. A HashMap is ilyen. Ezeket inkább csak függvények és osztályok belső logikájához használd. Visszatérési értéknek mindig próbálj immutable-t használni, mint a List vagy a Map. Azt gondolom észrevetted, hogy az interface típusokban nincs add és put. Okkal. ;)

Redmi Note 9 Pro

(#11929) fatal` válasza BE4GLE (#11928) üzenetére


fatal`
titán

A List meg a Map nem típus, hanem interface. És mindkettő a mutable típusok interface, a List interfaceben ott az add és a Mapban is a put.

(#11930) BE4GLE válasza fatal` (#11929) üzenetére


BE4GLE
aktív tag

LOL. Olyan rég Kotlin-ra váltottam, hogy már el is felejtettem, hogy a list is definiálja az add metódust. Akkor ha jól rémlik talán az Iterable a jó analógia rá. :B

Redmi Note 9 Pro

(#11931) Gyuri16 válasza BE4GLE (#11930) üzenetére


Gyuri16
senior tag

Iteratornak is van remove metodusa: [link]

Immutable kollekciokra tobb fuggveny van, pl. Collections.unmodifiableList, List.of (java 9), List.copyOf (java 10)

Nem vagyok egoista, csak uborkagyalu!

(#11932) BE4GLE válasza Gyuri16 (#11931) üzenetére


BE4GLE
aktív tag

Android vonalon én java 8-nál tetőztem. Kotlinban ez pl. így működik:
listOf(...) és mapOf(...) ha final kell és
mutableListOf(...) és mutableMapOf(...) ha mutable kell

Az List.of szintén List típust add vissza, csak gondolom dob egy csinos UnsupportedOperationException-t ha add-ot hívsz az outputra.

Redmi Note 9 Pro

(#11933) Gyuri16 válasza BE4GLE (#11932) üzenetére


Gyuri16
senior tag

igen, bovebben le van irva a dokumentacioban
Collection
List

Helyesen unmodifiable-nek kellene hivni, mert attol fuggoen mi van a kollekcioban az elemeket lehet akar valtoztatni.

Nem vagyok egoista, csak uborkagyalu!

(#11934) fatal` válasza BE4GLE (#11930) üzenetére


fatal`
titán

Nekem is meg kellett nézni, hogy rosszul emlékszem-e. :D

#11933:
Helyesen unmodifiable-nek kellene hivni, mert attol fuggoen mi van a kollekcioban az elemeket lehet akar valtoztatni.

Attól még maga a collection immutable.

[ Szerkesztve ]

(#11935) Gyuri16 válasza fatal` (#11934) üzenetére


Gyuri16
senior tag

"An unmodifiable collection is not necessarily immutable. If the contained elements are mutable, the entire collection is clearly mutable, even though it might be unmodifiable. For example, consider two unmodifiable lists containing mutable elements. The result of calling list1.equals(list2) might differ from one call to the next if the elements had been mutated, even though both lists are unmodifiable. However, if an unmodifiable collection contains all immutable elements, it can be considered effectively immutable. "

[link]

Nem vagyok egoista, csak uborkagyalu!

(#11936) BE4GLE válasza Gyuri16 (#11935) üzenetére


BE4GLE
aktív tag

Azt a kotlin extension-ök sem állítják, hogy a listOf(...) eredménye immutable. Szóval nekem tökéletesen megfelel a kotlinos elnevezés. És annak legaláb egy olyan List a visszatérési értéke, aminek nincs add metódusa, ami aztán random RuntimeException-t dobál, mint a javas alternatívák. De abban egyetértünk, hogy lista elemeinek is immutable-nek kell lenniük. :K

[ Szerkesztve ]

Redmi Note 9 Pro

(#11937) Foglalt név


Foglalt név
addikt

Nem teljesen java, inkább OOP kérdés, amiben kicsit elveszve érzem magam.
Vannak állataink, legyen mondjuk kenguru és tigris. Szeretnénk építeni egy cirkuszt, több ilyen állattal.
A cirkusz igazgató le tud hívni egy állatlistát, amiben látja mindkét fajt és az adataikat, pl. születési év. Illetve ha kiválaszt egyet, akkor utasítást adhat pl. egy gombbal. Mindkét állat tud a farkán ugrálni, viszont a kenguru el is tud rejteni valamit az erszényében.
A problémám, hogy sokak szerint egy instanceof mindig code smell. Akár leszármazást, akár kompozíciót használok, valahogy meg kell tudnom a lista egy adott elméről, hogy milyen többlet képessége.
Hogyan lehet ezt szépen megoldani?
Illetve lehet-e dinamikussá tenni az egészet, hogy kódváltoztatás nélkül új fajokat kreáljon az igazgató, amik saját "képességekkel" rendelkeznek?

(#11938) floatr válasza yossarian14 (#11927) üzenetére


floatr
veterán

Már van, de a java 8ról beszéltem a példa kedvéért, abban még nem volt.

(#11939) Drizzt válasza Foglalt név (#11937) üzenetére


Drizzt
nagyúr

Tobbfele megoldas lehet, de talan a legegyszerubb az, ha csinalsz egy Activity osztalyt, ami leirja, hogy mit es hogyan tud csinalni az az Activity.
Az allat osztalyban meg eltarolsz egy Activity Collection-t, amire csinalsz egy getter-t.
Aztan az Activity-bol csinalhatsz mondjuk egy KangarooHidingActivity-t, ami a konstruktoraban megkap egy Kangaroo-t. A Kangaroo konstruktoraban meg megcsinalod a KangarooHidingActivity-t, meg a masikat es belerakod oket egy collection-be.
Igy amikor vegigmesz egy Animal Collection-on, le tudod kerni az egyes Activity-k kollekciojat allatoktol fuggetlenul, azok az Activity-k meg megis kepesek lesznek allat specifikus dolgokat csinalni, az eppen megadott allaton.
Azt nem tudom, hogy ez egy ismert pattern-e, meg van-e neve, de egyszeru esetben valami ilyesmit csinalnek. A Command pattern nagyjabol ez, de talan nem pontosan.

[ Szerkesztve ]

I am having fun staying poor.

(#11940) Foglalt név válasza Drizzt (#11939) üzenetére


Foglalt név
addikt

Ráadásul ugyanezt meg tudom változókkal is csinálni, ugye?. Csinálok egy marker interface-t(AnimalAttribute), amihez hozzádobok esetleg egy getPossibleValues()-t és legrosszabb esetben kap az adott class egy wrapper-t. Így akár egy dinamikus listát is tudok csinálni, ahol a tigriseknek lesz Csíkvastagsága a kengurunak meg Erszénynyúlásiegyütthatója.
"Szabad" ilyet?

(#11941) BE4GLE válasza Foglalt név (#11937) üzenetére


BE4GLE
aktív tag

Szerintem az insteanceof önmagában még nem code smell. Kotlinban sem code smell az is operator. Sőt, ha használod, még smart cast-olja is az objektumot. A java azért más picit, mert ott neked kell cast-olni. Inkább azt mondanám, hogy könnyű code smell-t csinálni vele javaban. Például figyelni kell, hogy csakis final pointerre hívd meg, mert hiába csekkolod, hogy instanceof ha később változhat az object amire a pointer mutat.

Redmi Note 9 Pro

(#11942) Foglalt név válasza Foglalt név (#11940) üzenetére


Foglalt név
addikt

Belegondoltam és a változóknál bejön egy új aspektus, a backend.

(#11943) coco2


coco2
őstag

Sziasztok!

Android telefonra keresek példát BT broadcast üzenetet küldeni.

A tippeket köszönöm.

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

(#11944) BE4GLE válasza coco2 (#11943) üzenetére


BE4GLE
aktív tag

Szia! Nem értettem pontosan. Bluetooth broadcast receiver példát szeretnél? Vagy bluetooth-on szeretnél üzenetet küldeni?

Redmi Note 9 Pro

(#11945) Drizzt válasza Foglalt név (#11940) üzenetére


Drizzt
nagyúr

Szabadni szabad, de nem tul szep. Interface moge viselkedest illik rejteni, igy pl. azt, hogy miket tudnak csinalni az allatok, szivesen kiszerveznem interface-be, de azt, hogy milyen tulajdonsagai vannak az allatoknak, inkabb nem.
A backend dolgot nem tudom itt hogyan erted.

I am having fun staying poor.

(#11946) BE4GLE válasza Foglalt név (#11937) üzenetére


BE4GLE
aktív tag

Az OOP-vel könnyű átesni a ló túloldalára és túlkomplikálni egy egyszerű problémát. Pl. ha a kenguru el tud rejteni valamit azt lehet simán relációs adatszerkezetként is értelmezni. X elrjeti Y-t. Ez akár tárolható egy táblában is. A kengurunak nincs szüksége "elrejt" metódusra. Az lehet egy tőle független metódus. Az ugrás szintén egyszerű. Hiszen olyankor mozgatod és animálod az állat objektumot. Nem feltétlenül kell tudnia magáról, hogy ő képes e ugrani. Az ugrás metódus majd eldönti, hogy az adott faj képes e rá. Mozgatja és keres hozzá egy animációt, ha van. Ez mind megoldható faj azonosítóval. Nem kell instanceof. Próbáld az adatszerlezeteidet minél egyszerűbre írni. Egy állat nagyon sok mindenre képes. Hatalmas osztályaid lesznek, kismillió őssel, ha ilyen szemléletben tervezed őket. És az végül mindig visszaüt.

[ Szerkesztve ]

Redmi Note 9 Pro

(#11947) btraven válasza Foglalt név (#11937) üzenetére


btraven
őstag

Ezt nem értem miért a java topikba írtad.
De nézzük csak, kell egy oroszlánszelídítő. Artista meg bűvész is lehet. Meg kardnyelő. Bolhacirkusz.
Bohóc viszont mindenképpen kell, akár kettő is.

(#11948) coco2 válasza BE4GLE (#11944) üzenetére


coco2
őstag

Küldeni akarok. Sender kell az android telefonra. Az android telefon körül létező - és éppen broadcast-ra figyelő - összes BT eszközknek akarok egy pár karakteres üzenetet eljuttatni az androidról.

[ Szerkesztve ]

កុំភ្លេចប្រើភាសាអង់គ្លេសក្នុងបរិយាកាសអន្តរជាតិ។

(#11949) BE4GLE válasza coco2 (#11948) üzenetére


BE4GLE
aktív tag

Hm... Gyorsan rákerestem a githubon és egy ilyet találtam neked: [link] Kiindulási pontnak talán jó. Bár nem írtad, hogy a többi BT eszköz is androidos e.

Redmi Note 9 Pro

(#11950) BE4GLE válasza coco2 (#11948) üzenetére


BE4GLE
aktív tag

Amúgy nem iBeacon-ről van szó véletlenül? Mert ha igen, ahhoz itt egy library és egy sample projekt: [link]

Redmi Note 9 Pro

Útvonal

Fórumok  »  Szoftverfejlesztés  »  Java programozás (kiemelt téma)
Copyright © 2000-2024 PROHARDVER Informatikai Kft.