Μεθοδολογία Προγραμματισμού

Σχετικά έγγραφα
. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

. Μεθοδολογία Προγραμματισμού. Abstract Κλάσεις και Interfaces. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

. Μεθοδολογία Προγραμματισμού. Μοτίβα σχεδίασης (Design Patterns) Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

ΕΡΓΑΣΙΕΣ ΟΝΤΟΚΕΝΤΡΙΚΟΥ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Προγραμματισμός ΙI (Θ)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Πίνακες Κλάσεις και Αντικείμενα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ Ακαδημαϊκό έτος ΤΕΤΡΑΔΙΟ ΕΡΓΑΣΤΗΡΙΟΥ #4

Γραφικά υπολογιστών Εργαστήριο 4 Εισαγωγή στις λίστες

. Μεθοδολογία Προγραμματισμού. Εισαγωγή. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

Master Mind εφαρμογή στη γλώσσα προγραμματισμού C

Σημειώσεις του εργαστηριακού μαθήματος Πληροφορική ΙΙ. Εισαγωγή στην γλώσσα προγραμματισμού

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL)

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

. Μεθοδολογία Προγραμματισμού. Καλή και κακή σχεδίαση. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Υπερφόρτωση Αντικείμενα σαν ορίσματα

Εφαρμοσμένη Πληροφορική ΙΙ (Θ) Είσοδος/Έξοδος Μεταβλητές Τύποι Μεταβλητών Τελεστές και Προτεραιότητα Μετατροπές Μεταξύ Τύπων

2.1. Εντολές Σχόλια Τύποι Δεδομένων

Προγραμματισμός ΙI (Θ)

Εισαγωγή στην Επιστήμη Υπολογιστών. Εισαγωγή στην Python

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Διάλεξη 2η: Αλγόριθμοι και Προγράμματα

ΠΑΝΕΠΙΣΤΗΜΙΟ AΙΓΑIΟΥ & ΑΕΙ ΠΕΙΡΑΙΑ Τ.Τ. Τμήματα Ναυτιλίας και Επιχειρηματικών Υπηρεσιών & Μηχ. Αυτοματισμού ΤΕ. Εισαγωγή στη Python

ΤΕΧΝΟΛΟΓΙΑ ΛΟΓΙΣΜΙΚΟΥ Ι

Στη C++ υπάρχουν τρεις τύποι βρόχων: (a) while, (b) do while, και (c) for. Ακολουθεί η σύνταξη για κάθε μια:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

Τύποι δεδομένων, τελεστές, μεταβλητές

Εισαγωγή στον Αντικειμενοστρεφή Προγραμματισμό Διάλεξη #15

Εισαγωγή στον Προγραμματισμό

Συνοπτικό εγχειρίδιο χρήσης του Microsoft Visual Studio 2010

2ο ΓΕΛ ΑΓ.ΔΗΜΗΤΡΙΟΥ ΑΕΠΠ ΘΕΟΔΟΣΙΟΥ ΔΙΟΝ ΠΡΟΣΟΧΗ ΣΤΑ ΠΑΡΑΚΑΤΩ

ΠΑΝΕΠΙΣΤΗΜΙΟ ΚΥΠΡΟΥ - ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ

ΕΡΓΑΣΙΑ 1 Ημερομηνία Ανάρτησης: 02/02/2017 Ημερομηνία Παράδοσης: 16/02/2017, 09:00 π.μ. Στόχος Ορισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors

4 ο Εργαστήριο Τυχαίοι Αριθμοί, Μεταβλητές Συστήματος

Εργαστήριο 6 ο 7 ο / Ερωτήματα Ι

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών ΤΗΜΜΥ Α.Π.Θ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ.

Προγραμματισμός 2 Σημειώσεις εργαστηρίου

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Μέθοδοι

1.5 ΔΡΑΣΤΗΡΙΟΤΗΤΕΣ μικρόκοσμου «Προγραμματισμός Η/Υ»

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ ΔΙΑΓΩΝΙΣΜΑ ΠΡΟΣΟΜΟΙΩΣΗΣ 23/04/2012. Α. Να απαντήσετε με Σ ή Λ στις παρακάτω προτάσεις:

Εργαστήριο Επεξεργασίας Πληροφορίας και Υπολογισμών Τομέας Ηλεκτρονικής και Υπολογιστών ΤΗΜΜΥ Α.Π.Θ ΔΟΜΕΣ ΔΕΔΟΜΕΝΩΝ. DS Gomoku.

ΙΑΓΩΝΙΣΜΑ ΣΤΗΝ ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΘΕΜΑ 1 Α.

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων Παράδειγμα: Τμήμα πανεπιστημίου

Εαρινό. Ύλη εργαστηρίου, Ασκήσεις Java

Τμήμα Μηχανολόγων Μηχανικών Πανεπιστήμιο Θεσσαλίας ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Δομή Επανάληψης. Ιωάννης Λυχναρόπουλος Μαθηματικός, MSc, PhD

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Παράρτημα A: PHP, HTML φόρμες και το πρωτόκολλο HTTP.

Δομημένος Προγραμματισμός

Γραφικά υπολογιστών Εργαστήριο 9 Κλάσεις στην Python. Σκοπός της 9ης άσκησης είναι να μάθουμε αντικειμενοστρεφή προγραμματισμό στην Python.

Οικονοµικό Πανεπιστήµιο Αθηνών. Τµήµα Πληροφορικής. Φθινοπωρινό Εξάµηνο Δοµές Δεδοµένων - Εργασία 2. Διδάσκων: E. Μαρκάκης

Αντικειμενοστρεφής Προγραμματισμός Διάλεξη 2 : ΜΕΤΑΒΛΗΤΕΣ ΤΕΛΕΣΤΕΣ & ΕΚΦΡΑΣΕΙΣ ΕΛΕΓΧΟΣ ΡΟΗΣ

Συναρτήσεις. Εισαγωγή

Εισαγωγή στην Πληροφορική Προγραμματισμός-Λειτουργικά

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Αναφορές-Παράμετροι

. Μεθοδολογία Προγραμματισμού. UML Διαγράμματα. Νικόλαος Πεταλίδης. Εισαγωγή Εαρινό Εξάμηνο 2014

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java III

ΜΑΗΣ ΕΞΕΤΑΣΤΙΚΟ ΔΟΚΙΜΙΟ

ΚΕΦΑΛΑΙΟ 10 ΥΠΟΠΡΟΓΡΑΜΜΑΤΑ

Εισαγωγή στην C. Μορφή Προγράµµατος σε γλώσσα C

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Constructors, equals, tostring

Γράψτε ένα πρόγραμμα που θα προσομοιώνει τη ρίψη ενός νομίσματος και θα εμφανίζει στην οθόνη Κορώνα» ή «Γράμματα».

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Σύνθεση αντικειμένων

Κεφάλαιο 2.3: Προγραμματισμός. Επιστήμη ΗΥ Κεφ. 2.3 Καραμαούνας Πολύκαρπος

H κλάση ArrayList. Γιώργος Θάνος. Γραφείο Γ. Γκλαβάνη 37. Αντικει ενοστραφής Προγρα. ος όροφος

4 Συλλογές Αντικειμένων

Δυναμικές Ιστοσελίδες Εισαγωγή στην Javascript για προγραμματισμό στην πλευρά του client

ΠΛΗΡΟΦΟΡΙΚΗ ΙΙ (JAVA) 11/3/2008

Pascal, απλοί τύποι, τελεστές και εκφράσεις

Διαδικασιακός Προγραμματισμός

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Κλάσεις και Αντικείμενα Αναφορές

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Ενότητα: ΜΕΤΑΒΛΗΤΕΣ ΚΥΡΟΠΟΥΛΟΣ ΚΩΝΣΤΑΝΤΙΝΟΣ. Τμήμα Διοίκηση Επιχειρήσεων (Κοζάνη)

Προγραμματισμός ΙI (Θ)

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. Συλλογές και Επαναλήπτες. Συλλογές - Collections

TO ΥΠΟΠΡΟΓΡΑΜΜΑ ΣΥΝΑΡΤΗΣΗ

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργία Κλάσεων και Αντικειμένων Constructors

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Δημιουργώντας δικές μας Κλάσεις και Αντικείμενα

Κεφ. 2 Θέματα Θεωρητικής Επιστήμης Υπολογιστών. Κοντογιάννης Βασίλειος ΠΕ19

ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ Η/Υ. Ενότητα: ΔΟΜΕΣ ΕΠΑΝΑΛΗΨΗΣ ΚΥΡΟΠΟΥΛΟΣ ΚΩΝΣΤΑΝΤΙΝΟΣ. Τμήμα Διοίκηση Επιχειρήσεων (Κοζάνη)

ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΗΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΣ

ΚΕΦΑΛΑΙΟ 3. Εκφράσεις, τελεστές, σχόλια. 3.1 Εισαγωγή

Τμήμα Πολιτικών Μηχανικών και Μηχανικών Περιβάλλοντος ΠΠΜ 401: Ανάπτυξη Λογισμικού Εφαρμογών Μηχανικής, :00-10:00 π.μ.

Προγραµµατισµός ΙΙ. Ηγλώσσααντικειµενοστραφούς. ιδάσκων ηµήτριος Κατσαρός, Τµ. Μηχανικών Η/Υ, Τηλεπικοινωνιών & ικτύων Πανεπιστήµιο Θεσσαλίας

Αντικειμενοστρεφής Προγραμματισμός

Σημειωματάριο Δευτέρας 30 Οκτ. 2017

Εργαστήριο Δομημένος Προγραμματισμός (C#) Τμήμα Μηχανολογίας Νικόλαος Ζ. Ζάχαρης Καθηγητής Εφαρμογών

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Αναφορές Στοίβα και Σωρός Μνήμης Αντικείμενα ως ορίσματα

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Εισαγωγή στη Java

Εργαστήριο 2. Εαρινό Εξάμηνο Εντολές για είσοδο ακεραίων αριθμών από την κονσόλα:

ΤΕΧΝΙΚΕΣ ΑΝΤΙΚΕΙΜΕΝΟΣΤΡΑΦΟΥΣ ΠΡΟΓΡΑΜΜΑΤΙΣΜΟΥ. Constructors Υπερφόρτωση Αντικείμενα ως παράμετροι

5 ΕΙΣΑΓΩΓΗ ΣΤΗ ΘΕΩΡΙΑ ΑΛΓΟΡΙΘΜΩΝ

Ενότητα 1: «Εισαγωγή στην Αλγοριθμική και τον Προγραμματισμό. Απλές ασκήσεις με γλώσσα Pascal»

Αλγοριθμική & Δομές Δεδομένων- Γλώσσα Προγραμματισμού Ι (PASCAL) (PASCAL ) Εντολές Ελέγχου & Επανάληψης

Προγραμματισμός Η/Υ 1 (Εργαστήριο)

LATEX Site 2750 & Documents Class LATEX WYSIWYG

Κεφάλαιο 7 ο Βασικές Έννοιες Προγραμματισμού (σελ )

ΑΝΑΠΤΥΞΗ ΕΦΑΡΜΟΓΩΝ ΣΕ ΠΡΟΓΡΑΜΜΑΤΙΣΤΙΚΟ ΠΕΡΙΒΑΛΛΟΝ

Transcript:

Μεθοδολογία Προγραμματισμού Εισαγωγή στo συναρτησιακό προγραμματισμό με Java Νικόλαος Πεταλίδης Τμήμα Μηχανικών Η/Υ ΤΕΙ Κεντρικής Μακεδονίας Εισαγωγή Εαρινό Εξάμηνο Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 1 / 26

Συναρτησιακός προγραμματισμός Είναι ένας τρόπος προγραμματισμού όπου το αποτέλεσμα ενός προγράμματος προκύπτει μέσα από την εφαρμογή μίας ή περισσότερων συναρτήσεων Σε αντίθεση με τον προστακτικό (imperative) τρόπο προγραμματισμού όπου το αποτέλεσμα ενός προγράμματος προκύπτει από την αλλαγή της τιμής διάφορων μεταβλητών Στη Java υποστηρίζεται από την έκδοση 18 και μετά Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 2 / 26

Παράδειγμα προστακτικού προγραμματισμού Έστω ότι θέλουμε να βρούμε αν η πόλη Chicago είναι σε μια λίστα από πόλεις που μας έχει δοθεί Προστακτικός προγραμματισμός b o o l e a n f o u n d = f a l s e ; f o r ( S t r i n g c i t y : c i t i e s ) { i f ( c i t y e q u a l s ( " C h i c a g o " ) ) { f o u n d = t r u e ; b r e a k ; } } S y s t e m o u t p r i n t l n ( " Found c h i c a g o? : " + f o u n d ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 3 / 26

Παράδειγμα συναρτησιακού προγραμματισμού Συναρτησιακός προγραμματισμός S y s t e m o u t p r i n t l n ( " Found c h i c a g o? " + c i t i e s c o n t a i n s ( " C h i c a g o " ) ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 4 / 26

Διαφορές Δε χρειαστήκαμε μεταβλητές που αλλάζουν τιμές (found) Δε χρειαστήκαμε την επανάληψη Λιγότερος κώδικας, αντικατοπτρίζει καλύτερα το τί θέλουμε από το πώς θα το πετύχουμε Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 5 / 26

Ένα άλλο παράδειγμα Έστω ότι θέλουμε να αθροίσουμε τις τιμές ενός πίνακα, που είναι μεγαλύτερες από 20, βάζοντας σε κάθε μία από αυτές έκπτωση 10% Θα μπορούσαμε να έχουμε τον πιο κάτω πίνακα με τις τιμές: f i n a l L i s t < B i g D e c i m a l > p r i c e s = A r r a y s a s L i s t ( new B i g D e c i m a l ( " 10 " ), new B i g D e c i m a l ( " 30 " ), new B i g D e c i m a l ( " 17 " ), new B i g D e c i m a l ( " 20 " ), new B i g D e c i m a l ( " 15 " ), new B i g D e c i m a l ( " 18 " ), new B i g D e c i m a l ( " 45 " ), new B i g D e c i m a l ( " 12 " ) ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 6 / 26

Λύση με προστακτικό προγραμματισμό B i g D e c i m a l t o t a l O f D i s c o u n t e d P r i c e s = B i g D e c i m a l ZERO ; f o r ( B i g D e c i m a l p r i c e : p r i c e s ) { i f ( p r i c e compareto ( B i g D e c i m a l v a l u e O f ( 2 0 ) ) > 0 ) t o t a l O f D i s c o u n t e d P r i c e s = t o t a l O f D i s c o u n t e d P r i c e s add ( p r i c e m u l t i p l y ( B i g D e c i m a l v a l u e O f ( 0 9 ) ) ) ; } S y s t e m o u t p r i n t l n ( " T o t a l o f d i s c o u n t e d p r i c e s : " + t o t a l O f D i s c o u n t e d P r i c e s ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 7 / 26

Λύση με συναρτησιακό προγραμματισμό f i n a l B i g D e c i m a l t o t a l O f D i s c o u n t e d P r i c e s = p r i c e s s t r e a m ( ) f i l t e r ( p r i c e > p r i c e compareto ( B i g D e c i m a l v a l u e O f ( 2 0 ) ) > 0) map ( p r i c e > p r i c e m u l t i p l y ( B i g D e c i m a l v a l u e O f ( 0 9 ) ) ) r e d u c e ( B i g D e c i m a l Z e r o, B i g D e c i m a l : : add ) ; S y s t e m o u t p r i n t l n ( " T o t a l o f d i s c o u n t e d p r i c e s : " + t o t a l O f D i s c o u n t e d P r i c e s ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 8 / 26

Μικρές επεξηγήσεις Οι συναρτήσεις stream (), filter (), map (), reduce () προστέθηκαν στη Java 18 και επιδρούν στα στοιχεία μιας συλλογής (Collection) Ειδικότερα οι filter (), map (), reduce () είναι συναρτήσεις υψηλότερης τάξης μια που όπως φαίνεται δέχονται ως παράμετρο άλλες συναρτήσεις Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 9 / 26

Συλλογές Αρκετές από τις ευκολίες που μας δίνει η προσθήκη των νέων μηχανισμών της Java αφορούν στη διαχείριση συλλογών Πιο συγκεκριμένα έχουμε νέους τρόπους Να διατρέξουμε τα στοιχεία μιας συλλογής Να μετατρέψουμε τα στοιχεία της Να επιλέξουμε στοιχεία της Να ενώσουμε στοιχεία Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 10 / 26

Διατρέχοντας τα στοιχεία μιας λίστας Υπάρχει μια νέο μέθοδος foreach () στο Iteratable interface Η μέθοδος αυτή δέχεται ως παράμετρο ένα αντικείμενο τύπου Consumer το οποίο υλοποιεί μια μέθοδο accept () Αν θέλαμε να τυπώσουμε τα στοιχεία αυτής της λίστας: f i n a l L i s t < S t r i n g > f r i e n d s = A r r a y s a s L i s t ( " B r i a n ", " Nate ", " N e a l ", " R a j u ", " S a r a ", " S c o t t " ) ; θα μπορούσαμε να το κάνουμε έτσι: f r i e n d s f o r E a c h ( new Consumer < S t r i n g > ( ) { p u b l i c v o i d a c c e p t ( f i n a l S t i n g name ) { S y s t e m o u t p r i n t l n ( name ) ; } } ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 11 / 26

Τι βελτιώσαμε; Η μοναδική βελτίωση που κάναμε ήταν ότι εξαλείψαμε το βρόγχο for, και πλέον ορίζουμε μόνο το τι θέλουμε να κάνουμε με τα στοιχεία της λίστας, αντί να ορίζουμε και πώς θα τη διατρέξουμε Ο κώδικας όμως είναι δυσανάγνωστος Έχουμε χρησιμοποιήσει το συντακτικό των ανώνυμων κλάσεων της Java το οποίο είναι ομολογουμένως δύσκολο Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 12 / 26

Εκφράσεις λάμδα Αντί της χρήσης του δυσανάγνωστου συντακτικού των ανώνυμων κλάσεων θα μπορούσαμε να χρησιμοποιήσουμε ένα lambda expression και να γράφαμε τον κώδικα απλώς ως εξής: f r i e n d s f o r E a c h ( ( f i n a l S t r i n g name ) > S y s t e m o u t p r i n t l n ( name ) ) ; Ένα lambda expression είναι ουσιαστικά μια συνάρτηση χωρίς όνομα Στο συγκεκριμένο παράδειγμα η συνάρτηση αυτή παίρνει ως παράμετρο ένα String και το τυπώνει στην κονσόλα Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 13 / 26

Απλουστεύσεις Ο compiler της Java είναι αρκετά έξυπνος και μπορεί πολλές φορές να καταλάβει τον τύπο της μεταβλητής Έτσι ο ακόλουθος κώδικας είναι επίσης σωστός: f r i e n d s f o r E a c h ( ( name ) > S y s t e m o u t p r i n t l n ( name ) ) ; ή και χωρίς τις παρενθέσεις f r i e n d s f o r E a c h ( name > S y s t e m o u t p r i n t l n ( name ) ) ; ή f r i e n d s f o r E a c h ( S y s t e m o u t : : p r i n t l n ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 14 / 26

Μετασχηματίζοντας λίστες Έστω ότι θέλουμε να αλλάξουμε τη λίστα των ονομάτων του προηγούμενου παραδείγματος σε κεφαλαίο Μια παραδοσιακή προσέγγιση θα ήταν η ακόλουθη: f i n a l L i s t < S t r i n g > u p p e r c a s e N a m e s = new A r r a y L i s t < > ( ) ; f o r ( S t r i n g name : f r i e n d s ) { u p p e r c a s e N a m e s add ( name t o U p p e r C a s e ( ) ) ; } Χρησιμοποιώντας lambda expressions θα μπορούσαμε να το γράψουμε ως εξής: f i n a l L i s t < S t r i n g > u p p e r c a s e N a m e s = new A r r a y L i s t < > ( ) ; f r i e n d s f o r E a c h ( name > u p p e r c a s e N a m e s add ( name t o U p p e r C a s e ( ) ) ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 15 / 26

Προβλήματα με την προηγούμενη προσέγγιση Το βασικό πρόβλημα προς μια καθαρά συναρτησιακή προσέγγιση είναι η χρήση της μεταβλητής uppercasenames η οποία μεταβάλλεται συνεχώς Αντ' αυτού μπορούμε να χρησιμοποιήσουμε το νέο Stream interface και τις μεθόδους του f r i e n d s s t r e a m ( ) map ( name >name t o U p p e r C a s e ( ) ) f o r e a c h ( / / Do w h a t e v e r you want h e r e ) Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 16 / 26

Stream Η μέθοδος stream () μετατρέπει ένα Collection σε Stream Η μέθοδος map() εφαρμόζει τον κώδικα μέσα στις παρενθέσεις σε κάθε στοιχείο της συλλογής και δημιουργεί μια νέα συλλογή με αυτά τα στοιχεία Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 17 / 26

Φιλτράροντας στοιχεία Έστω ότι θέλουμε από τη λίστα με τα ονόματα να βρούμε όσα ξεκινάνε από N Η συναρτησιακή προσέγγιση θα ήταν η ακόλουθη f i n a l L i s t < S t r i n g > s t a r t s W i t h N = f r i e n d s s t r e a m ( ) f i l t e r ( name >name s t a r t s W i t h ( " N " ) ) c o l l e c t ( C o l l e c t o r s t o L i s t ( ) ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 18 / 26

Filter Η μέθοδος filter () μοιάζει με τη map γιατί επιστρέφει ένα νέο collection Περιμένει ένα lambda expression που επιστρέφει boolean Σε αντίθεση με τη map() το collection που θα επιστρέψει μπορεί να έχει λιγότερα στοιχεία από το αρχικό Ένα στοιχείο προστίθεται στο collection που επιστρέφει, όταν το lamdba expression επιστρέψει true Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 19 / 26

Collect Η μέθοδος collect () μαζεύει τα στοιχεία από ένα stream και τα συλλέγει σε ένα νέο collection Χρησιμοποιείται συχνά για να αποθηκευθούν τα αποτελέσματα μιας έκφρασης σε μια μεταβλητή Προσφέρει περισσότερες δυνατότητας παράλληλης εκτέλεσης, από ό,τι αν προσπαθούσαμε μόνοι μας να δημιουργήσουμε το νέο collection Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 20 / 26

Επαναχρησιμοποίηση lambda expressions Μια έκφραση lambda μπορεί να αποθηκευθεί σε μια μεταβλητή και να επαναχρησιμοποιηθεί Για παράδειγμα: f i n a l P r e d i c a t e < S t r i n g > s t a r t s W i t h N = name > name s t a r t s W i t h ( " N " ) ; f i n a l l o n g c o u n t A L i s t = a L i s t s t r e a m ( ) f i l t e r ( s t a r t s W i t h N ) c o u n t ( ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 21 / 26

Παραμετροποίηση σε μεγαλύτερο βαθμό Στο προηγούμενο παράδειγμα ελέγχουμε μόνο για το γράμμα Ν Θα θέλαμε περισσότερη ευελιξία και να ορίζουμε εμείς το γράμμα Θα μπορούσαμε να το ορίσουμε με αυτόν τον τρόπο p u b l i c s t a t i c P r e d i c a t e < S t r i n g > c h e c k I f S t a r t s W i t h ( f i n a l S t r i n g l e t t e r ) { r e t u r n name >name s t a r t s W i t h ( l e t t e r ) ; } Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 22 / 26

Closure και lexical scoping Στο προηγούμενο παράδειγμα επιστρέφουμε ένα lambda expression name είναι η παράμετρος που παίρνει το lambda expression Τι είναι το letter ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 23 / 26

Closure και lexical scoping H μεταβλητή letter δεν ορίζεται στο lambda expression αλλά στον ορισμό του lambda expression Η java θα πάρει την τιμή της από εκεί Αυτό είναι το lexical scoping ή closure Με τον τρόπο αυτό αποθηκεύουμε τιμες σε ένα σημεί για να τα χρησιμοποιήσουμε αργότερα Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 24 / 26

Παράδειγμα f i n a l l o n g c o u n t F r i e n d s S t a r t N = f r i e n d s s t r e a m ( ) f i l t e r ( c h e c k I f S t a r t s W i t h ( " N " ) ) c o u n t ( ) ; Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 25 / 26

Βιβλιογραφία Οι διαφάνειες είναι από το Venkat Subramaniam, "Functional Programing in Java", The Pragmatic Programmers, 2014 Ν Πεταλίδης (ΤΕΙ Κεντρικής Μακεδονίας) Μεθοδολογία Προγραμματισμού 26 / 26